{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D22","name":"Internal API Consistency","shortDescription":{"text":"Internal API Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D22"},{"id":"D25","name":"ADR Conformance","shortDescription":{"text":"ADR Conformance"},"helpUri":"https://codehealth.canine.dev/dimensions/D25"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"]}},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"]}},{"id":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AX8","name":"Test isolation","shortDescription":{"text":"Test isolation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX8"},{"id":"AX9","name":"CQS / query purity","shortDescription":{"text":"CQS / query purity"},"helpUri":"https://codehealth.canine.dev/dimensions/AX9"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"ES1","name":"Fold determinism","shortDescription":{"text":"Fold determinism"},"helpUri":"https://codehealth.canine.dev/dimensions/ES1"},{"id":"ES2","name":"Immutable events","shortDescription":{"text":"Immutable events"},"helpUri":"https://codehealth.canine.dev/dimensions/ES2"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"pyo3_macros_backend::module::pymodule_module_impl (cyclomatic 37): pyo3_macros_backend::module::pymodule_module_impl has cyclomatic complexity 37 (threshold 15). Of this number, 32 points are the body\u0027s own statements and 5 belong to one function item inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/module.rs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c74e7e2c26e156837a572ec543385eaa693b9e6605b5a3922e3cdeb112303b9"}},{"ruleId":"D1","level":"warning","message":{"text":"Imports::serialize_expr (cyclomatic 28): Imports::serialize_expr has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"72508cd5143692496379e5b5ed441e82a91fe270f485e56bd5c2ba641bb8c0ad"}},{"ruleId":"D1","level":"warning","message":{"text":"pyo3_ffi_check_macro::for_all_fields (cyclomatic 27): pyo3_ffi_check_macro::for_all_fields has cyclomatic complexity 27 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"308953c8064b728aceb1018187502351273838eada545aa6c3918c6fb790ad84"}},{"ruleId":"D1","level":"warning","message":{"text":"PyClassPyO3Option::parse (cyclomatic 26): PyClassPyO3Option::parse has cyclomatic complexity 26 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"12281c5931769be86c83bca87079d133a987f5b7c9ff309c679b6f14c2e792a2"}},{"ruleId":"D1","level":"warning","message":{"text":"PyStaticExpr::fmt (cyclomatic 26): PyStaticExpr::fmt has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/inspect.rs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e1513b0cce76da26470a9bb0feb7915ea2583b20aa80caae725bf618353485e"}},{"ruleId":"D1","level":"warning","message":{"text":"FnSpec::parse_fn_type (cyclomatic 21): FnSpec::parse_fn_type has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":684}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d22ac576dede3d96475194c25b008b417254ca9e4207d05ac3c0999e235fc27"}},{"ruleId":"D1","level":"warning","message":{"text":"pyo3_macros_backend::pyimpl::method_introspection_code (cyclomatic 21): pyo3_macros_backend::pyimpl::method_introspection_code has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyimpl.rs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"afa12e2572137492a36b2a1a3eeb572d7c964803259d132f49e176bb1e2c6562"}},{"ruleId":"D1","level":"warning","message":{"text":"pyo3_ffi_check_macro::for_all_functions (cyclomatic 20): pyo3_ffi_check_macro::for_all_functions has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":640}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac4c9770d77f1d733266bf53a89de326c91e212464d977c9a9384091c094b2ba"}},{"ruleId":"D1","level":"warning","message":{"text":"pyo3_macros_backend::pyimpl::add_shared_proto_slots (cyclomatic 20): pyo3_macros_backend::pyimpl::add_shared_proto_slots has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyimpl.rs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"d283fa92337314884cad98406e0404071fcec4afe8b8514b073db79ed790e3e3"}},{"ruleId":"D1","level":"warning","message":{"text":"InterpreterConfig::from_reader (cyclomatic 19): InterpreterConfig::from_reader has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-build-config/src/impl_.rs"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdf39a7a6b138b3d3b012fb9dcacd2224d5fedb95f9f75b685e14043847a96a5"}},{"ruleId":"D1","level":"warning","message":{"text":"glossary_linker.link_terms_in_content (cyclomatic 19): glossary_linker.link_terms_in_content has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"guide/glossary_linker.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79403858cfad74b45945913b84d2144b55e57e002d62f1db60dc69adaad6098"}},{"ruleId":"D1","level":"warning","message":{"text":"IntrospectionNode::add_to_serialization (cyclomatic 18): IntrospectionNode::add_to_serialization has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/introspection.rs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf25d64ef2acbe25814436428ff570edf9bba44a2bdfdcc8e6e7e326e1b1d864"}},{"ruleId":"D1","level":"warning","message":{"text":"pyo3_macros_backend::introspection::arguments_introspection_data (cyclomatic 18): pyo3_macros_backend::introspection::arguments_introspection_data has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/introspection.rs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf259b770aaf328ab888ee9a4d3ffb59c9ed3466c03c8cf2b4eec0486494ffd"}},{"ruleId":"D1","level":"warning","message":{"text":"PyClassImplsBuilder::impl_pyclassimpl (cyclomatic 17): PyClassImplsBuilder::impl_pyclassimpl has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages. This is NOT this file\u0027s highest cyclomatic complexity: PyClassPyO3Options::set_option (cyclomatic 25) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded function is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":2789}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd5c863e7dff7603dce1daa95e9e03196ae3df7422cf2439a328e3c3e71a7560"}},{"ruleId":"D1","level":"warning","message":{"text":"FunctionSignature::from_arguments_and_attribute (cyclomatic 17): FunctionSignature::from_arguments_and_attribute has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyfunction/signature.rs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"f438976cb368355752a251c6deb7c8c8b0ee443df55fa613a639fe0109f3afc6"}},{"ruleId":"D1","level":"warning","message":{"text":"FnSpec::get_wrapper_function (cyclomatic 16): FnSpec::get_wrapper_function has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":818}}}],"partialFingerprints":{"codehealthFindingId/v1":"be532d5e22ed4fd70608d9eae726c274c5063d01ec74f9cf2eee4fbeed938f0c"}},{"ruleId":"D1","level":"warning","message":{"text":"noxfile.check_feature_powerset (cyclomatic 16): noxfile.check_feature_powerset has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":1614}}}],"partialFingerprints":{"codehealthFindingId/v1":"46c3e1aa0af4a9e671927aa030c21872271e7bd46d139112a20c49ba84f162c9"}},{"ruleId":"D2","level":"warning","message":{"text":"glossary_linker.link_terms_in_content (cognitive 35): glossary_linker.link_terms_in_content has cognitive complexity 35 (threshold 15). Drivers by points: if/else 11 (25 pts), loops 5 (8 pts), boolean chains 2 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"guide/glossary_linker.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"f019211a748d2309cc98ac098873dc5bbf21412c1268ed39bd77c7cff5dfc6f0"}},{"ruleId":"D2","level":"warning","message":{"text":"Imports::serialize_expr (cognitive 34): Imports::serialize_expr has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (22 pts), match/switch 3 (7 pts), loops 2 (5 pts) (nesting depth added 18). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"862058ab336984bbc266ae9163ced4f1a9c87e79ada7698565b96387f6e3c025"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_macros_backend::module::pymodule_module_impl (cognitive 34): pyo3_macros_backend::module::pymodule_module_impl has cognitive complexity 34 (threshold 15). Drivers by points: if/else 14 (26 pts), boolean chains 4, loops 1 (2 pts), match/switch 2 (nesting depth added 13). Of this number, 31 points are the body\u0027s own statements and 3 belong to one function item inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/module.rs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cf888e0407db5a0c72269736b8bbdd06dfb4445698d1acc139b733d11f7db28"}},{"ruleId":"D2","level":"warning","message":{"text":"Imports::create (cognitive 33): Imports::create has cognitive complexity 33 (threshold 15). Drivers by points: if/else 9 (24 pts), loops 4 (7 pts), boolean chains 2 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f373a83c811a80f76d48cd40cc5f0ed711f96d7ef34a589ee567402767e546"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_ffi_check_macro::for_all_fields (cognitive 31): pyo3_ffi_check_macro::for_all_fields has cognitive complexity 31 (threshold 15). Drivers by points: if/else 15 (18 pts), boolean chains 9, match/switch 3, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c86e6c752da8fc9dc90ac8f4ce03efa6c26535ca1b0668de5f848689933ef3b"}},{"ruleId":"D2","level":"warning","message":{"text":"IntrospectionNode::add_to_serialization (cognitive 30): IntrospectionNode::add_to_serialization has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (16 pts), loops 4 (10 pts), match/switch 2 (4 pts) (nesting depth added 16). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/introspection.rs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"8242cd5d7c109a8a839b86a8e4b04cfd08c6f82c3acbbd5e1cbc64d1e9e90509"}},{"ruleId":"D2","level":"warning","message":{"text":"FunctionSignature::from_arguments_and_attribute (cognitive 30): FunctionSignature::from_arguments_and_attribute has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (24 pts), match/switch 2 (4 pts), loops 2 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyfunction/signature.rs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"efb4f8a7404a0826a2fab5470dbde64fc32fbf4c4acd3f6c9e25c38f76a2230f"}},{"ruleId":"D2","level":"warning","message":{"text":"noxfile._raw_dylib_x86_private_functions (cognitive 29): noxfile._raw_dylib_x86_private_functions has cognitive complexity 29 (threshold 15). Drivers by points: if/else 5 (22 pts), loops 3 (6 pts), boolean chains 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":1534}}}],"partialFingerprints":{"codehealthFindingId/v1":"83ac7320f4ef7624778479dccccf7c8c6746fde052a5ac6a20ad1463f58e7bab"}},{"ruleId":"D2","level":"warning","message":{"text":"FnSpec::get_wrapper_function (cognitive 28): FnSpec::get_wrapper_function has cognitive complexity 28 (threshold 15). Drivers by points: if/else 16 (22 pts), match/switch 3 (5 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":818}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c1658f71410be9b861881e21efef28cd6e475329ee6d465f70f1e99d4c07a6d"}},{"ruleId":"D2","level":"warning","message":{"text":"PyStaticExpr::fmt (cognitive 28): PyStaticExpr::fmt has cognitive complexity 28 (threshold 15). Drivers by points: if/else 8 (16 pts), match/switch 4 (9 pts), loops 1 (3 pts) (nesting depth added 15). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/inspect.rs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e65959a5035689a4216b9f8fbae8613d6bbe7c12ef116ef0471c4471463d130"}},{"ruleId":"D2","level":"warning","message":{"text":"PyClassPyO3Option::parse (cognitive 26): PyClassPyO3Option::parse has cognitive complexity 26 (threshold 15). Drivers by points: if/else 26. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"f632c040b7ea5c77c4ab5036ef03c4fef57d150e0779ad5a79916f6ae5db4194"}},{"ruleId":"D2","level":"warning","message":{"text":"PyClassImplsBuilder::impl_pyclassimpl (cognitive 26): PyClassImplsBuilder::impl_pyclassimpl has cognitive complexity 26 (threshold 15). Drivers by points: if/else 22, match/switch 3, boolean chains 1. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":2789}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffbea4825ecf50efc04a6fccaa7cbd325b7f511461477a73c8f29f8438c2647d"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_macros_backend::introspection::arguments_introspection_data (cognitive 26): pyo3_macros_backend::introspection::arguments_introspection_data has cognitive complexity 26 (threshold 15). Drivers by points: if/else 17 (24 pts), loops 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/introspection.rs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"324f30a41a9d608204d6602256217a28702dfee8f66cc5b60d790b716f0deb62"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_macros_backend::utils::get_doc (cognitive 25): pyo3_macros_backend::utils::get_doc has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (24 pts), loops 1 (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/utils.rs"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"b595d6c1e487e2d76722a83df41991a2bc8d271eebe8fe5764c8f67743f8a6d3"}},{"ruleId":"D2","level":"warning","message":{"text":"FunctionDescription::handle_kwargs (cognitive 24): FunctionDescription::handle_kwargs has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (23 pts), loops 1 (nesting depth added 15). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/extract_argument.rs"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"a61a1783ce2ee9e041c6806bdf44b4845489685c1104d93409dd9bf187d3524f"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_build_config::impl_::search_lib_dir (cognitive 23): pyo3_build_config::impl_::search_lib_dir has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 3, match/switch 1 (2 pts), loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-build-config/src/impl_.rs"},"region":{"startLine":2165}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d532cccbbf8c64b54a42d08603978e3d43f53f411920a3b77df5bfcffffaf5c"}},{"ruleId":"D2","level":"warning","message":{"text":"noxfile.check_test_features (cognitive 23): noxfile.check_test_features has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 4 (6 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":1158}}}],"partialFingerprints":{"codehealthFindingId/v1":"adb9542f0d5a70d5deba46cf3ff665743b4de14947a3f086131fce11ac367c4c"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_introspection::stubs::push_docstring (cognitive 22): pyo3_introspection::stubs::push_docstring has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (17 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"8434fe15853f066e281068df2deab2731badf2bb5a5edc2b428ba71db601ba83"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_macros_backend::intopyobject::build_derive_into_pyobject (cognitive 22): pyo3_macros_backend::intopyobject::build_derive_into_pyobject has cognitive complexity 22 (threshold 15). Drivers by points: if/else 13 (17 pts), match/switch 3 (4 pts), loops 1 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/intopyobject.rs"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"60e96b50858400c88455af13101f1a031bfefa82f2d9224975e32f975862d8f6"}},{"ruleId":"D2","level":"warning","message":{"text":"tabs.changeTab (cognitive 22): tabs.changeTab has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (18 pts), loops 2 (4 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"guide/theme/tabs.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"00ae281429a3789e661508ac4b0fdbe7d6233a92748383522ba885bf7581aceb"}},{"ruleId":"D2","level":"warning","message":{"text":"FnSpec::parse_fn_type (cognitive 21): FnSpec::parse_fn_type has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (16 pts), match/switch 2 (3 pts), loops 1 (2 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":684}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b48beee6ee985b085641d7ccd161e0bd5a7aadc4618a072fce515701c59e780"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_macros_backend::pyclass::build_py_class (cognitive 21): pyo3_macros_backend::pyclass::build_py_class has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 2 (4 pts), match/switch 3 (4 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8bdf8374b384005569b297b2334ca60490efdf3564b49b6b4fc14770cb1415d"}},{"ruleId":"D2","level":"warning","message":{"text":"noxfile.format_guide (cognitive 20): noxfile.format_guide has cognitive complexity 20 (threshold 15). Drivers by points: if/else 3 (11 pts), loops 4 (9 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"606cc2f5e8820ebb61cad9b30459313cde8e3e9c6c96fe0bbdc7c4d7ff053c04"}},{"ruleId":"D2","level":"warning","message":{"text":"noxfile._format_ffi_extern (cognitive 20): noxfile._format_ffi_extern has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (13 pts), loops 3 (4 pts), boolean chains 2, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":1012}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af2ccd5aa9b422a655135e28c1e4265b3f33c1ee415322030d69802d761bde2"}},{"ruleId":"D2","level":"warning","message":{"text":"SelfType::receiver (cognitive 19): SelfType::receiver has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (14 pts), match/switch 3 (5 pts) (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"7139527c4d767f73e92a9a643928ff38976fe623b25ad513765b41cb0e10fd78"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_macros_backend::pyimpl::add_shared_proto_slots (cognitive 19): pyo3_macros_backend::pyimpl::add_shared_proto_slots has cognitive complexity 19 (threshold 15). Drivers by points: if/else 19. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyimpl.rs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"e973d89f2b4f2a9352d9e4ef50543f7fd4d83a44388c4b838da891ad22e68104"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_build_config::impl_::default_lib_name_windows (cognitive 18): pyo3_build_config::impl_::default_lib_name_windows has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13 (16 pts), boolean chains 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-build-config/src/impl_.rs"},"region":{"startLine":2398}}}],"partialFingerprints":{"codehealthFindingId/v1":"85776be7e9544eaeb79bb1373e3c4b710369727d4a93b925a804f7817999a7c0"}},{"ruleId":"D2","level":"warning","message":{"text":"FieldAttribute::parse (cognitive 18): FieldAttribute::parse has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12 (18 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/derive_attributes.rs"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"00b58890ec0b83d5a595a973ec1afd0e88158c91c88d680e46a1a7eac4f66c19"}},{"ruleId":"D2","level":"warning","message":{"text":"Container::new (cognitive 18): Container::new has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (13 pts), match/switch 2 (5 pts) (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"190798ca60a03fa65297f5974cbb56bf5d709a5e7da59105565880f99ffa8c31"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_ffi_check_macro::for_all_functions (cognitive 17): pyo3_ffi_check_macro::for_all_functions has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 pts), match/switch 3 (5 pts), loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":640}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ffd6818b244dc1ce276cfcbce47df302bf4e5c3c9570e1bb725f4770fa4079a"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_introspection::stubs::function_stubs (cognitive 17): pyo3_introspection::stubs::function_stubs has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (13 pts), loops 4 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4c45a382a8bc0b11e15a5586ba6d664ee94a498208010a04786061341bad3e5"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_macros_backend::pymethod::impl_py_setter_def (cognitive 17): pyo3_macros_backend::pymethod::impl_py_setter_def has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (12 pts), match/switch 3, loops 1 (2 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pymethod.rs"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c76acb7db59828d6ddfb62ae794074a7ccfeb1912c1371ed3a559e2382f393c"}},{"ruleId":"D2","level":"warning","message":{"text":"pyo3_ffi::compat::py_3_15::_PyBytesWriter_Resize_impl (cognitive 16): pyo3_ffi::compat::py_3_15::_PyBytesWriter_Resize_impl has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (16 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/compat/py_3_15.rs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"065ba3a256a44dc0d73c35c19c54ccff6b8e580e66d671c8d393decdba0113aa"}},{"ruleId":"D2","level":"warning","message":{"text":"SignatureItem::parse (cognitive 16): SignatureItem::parse has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyfunction/signature.rs"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"21666d17722181a18b9bf2571a2a777d888be32f44cf03c8b7bab11435c860a4"}},{"ruleId":"D2","level":"warning","message":{"text":"noxfile.check_feature_powerset (cognitive 16): noxfile.check_feature_powerset has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13 (14 pts), boolean chains 1, loops 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":1614}}}],"partialFingerprints":{"codehealthFindingId/v1":"9725817049ad27ac733702c2ca3533ad167cec2802ae8b77e4781fe7f6ca59b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/pyclass.rs: FileTooLong \u2014 2336 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 39 free functions. The bar is 500 significant lines; this is 1836 over it, 4.67\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6624e3e31c616c1890a5b21e463aa8a49201ff40407ab28ae17e4a596fd9321"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/impl_.rs: FileTooLong \u2014 1542 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 41 free functions. The bar is 500 significant lines; this is 1042 over it, 3.08\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-build-config/src/impl_.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c81fe735620299a253d85123f77a4dc1c96e2b269567bcb10fa0d258b322ae84"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/pymethod.rs: FileTooLong \u2014 1442 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 942 over it, 2.88\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pymethod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1130350cab5f70542e43f315c6f4359b33d0cb8d6dbbb5178ffb5d06254e692"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyo3_macros_backend::module::pymodule_module_impl: FunctionTooLong \u2014 pyo3_macros_backend::module::pymodule_module_impl runs 278 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 178 over it, 2.78\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/module.rs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3085e555aa17c7cbdddb9c7f8cc675dd7c3abae73a9eda420d9c9616c213e946"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: PyConfig: TooManyFields \u2014 81 stored fields. The bar is 30 stored fields; this is 51 over it, 2.70\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/cpython/initconfig.rs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef192eb9962bde8e4677bb6a5dcfabdd1936618f1e8443935ee49ab75fbf46ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ./noxfile.py: FileTooLong \u2014 1264 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 764 over it, 2.53\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b95e60ad8f3bd8b25a541a06fcbfab5a84a3469a7a18e99101cacbea608e6abf"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PyClassImplsBuilder.impl_pyclassimpl: MethodTooLong \u2014 impl_pyclassimpl runs 209 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 109 over it, 2.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":2789}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f5df3660c22d8b88ef07858a9d0b84bc314de3c29038b898a34fefda7f0180"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: PyTypeObject: TooManyFields \u2014 58 stored fields. The bar is 30 stored fields; this is 28 over it, 1.93\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/cpython/object.rs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fe6c675205e8ebca7c2ee45bfd50bfdf8e4d043d0be197d12028c6ecc1ef00d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: impl_/pyclass.rs: FileTooLong \u2014 909 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 409 over it, 1.82\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pyclass.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b05a921769e5b638af874507dc8912a0a6c17cbb1babf9812c4b53ee0ddeb245"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/method.rs: FileTooLong \u2014 852 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 352 over it, 1.70\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"110e2a855819609a49b1b9265dedbc7b1a70b66d4b8282b21b16ed148e2dbb36"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: FnSpec.get_wrapper_function: MethodTooLong \u2014 get_wrapper_function runs 165 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":818}}}],"partialFingerprints":{"codehealthFindingId/v1":"e46d4b01a79de83516b36e8412edc117172838b4b8b0b2d24838eac9a36ea728"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: PyTypeObject39Snapshot: TooManyFields \u2014 49 stored fields. The bar is 30 stored fields; this is 19 over it, 1.63\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/internal/get_slot.rs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"61d372e1792332f8b3fb3e0620d26719e5b483f73ba2fa97e1bf60ecf3f9c498"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Py: TooManyMethods \u2014 45 methods, declared across 3 files: src/instance.rs (41), types/string.rs (3), types/bytes.rs (1). The bar is 30 methods; this is 15 over it, 1.50\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. This type is on a published API surface \u2014 a cargo-semver-checks gate in CI (.github/workflows/ci.yml) declares its compatibility contractual \u2014 so moving members onto a smaller type is a breaking change for every consumer, not a local refactor. To reduce it, treat the split as an API migration: move each cohesive group onto its own published type and keep the old members as deprecated forwards for a deprecation period, removing them at the next compatibility break. Where the surface has to stay as it is, that is a decision to record rather than a change to make."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/instance.rs"},"region":{"startLine":1494}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ebc2e583b5ee71d4cd564a1a59371001460940a23445849f6a0572fb89cd7f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/instance.rs: FileTooLong \u2014 746 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 246 over it, 1.49\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/instance.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f90d60700bbf3cab98130e17b542b6d50ce30b339cd826e8a0fef52a2bf78f5e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: impl_/extract_argument.rs: FileTooLong \u2014 672 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 172 over it, 1.34\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/extract_argument.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5ab5e3e63e6d628a44ce39d2dfdb5c01f0a4395bf8d90ae7c9afe253fca7e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyo3_macros_backend::pyclass::impl_simple_enum: FunctionTooLong \u2014 pyo3_macros_backend::pyclass::impl_simple_enum runs 132 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 32 over it, 1.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1015}}}],"partialFingerprints":{"codehealthFindingId/v1":"c159115252f8a21c9d4bb4855699bc796dc10747fdce60459f6cf71f32643d33"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: types/tuple.rs: FileTooLong \u2014 650 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 150 over it, 1.30\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/tuple.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c44a4b9758583ecda20f570bcd003e04f704f82e7247b9eb66dffcdf32e60bfe"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: InterpreterConfig.from_interpreter: MethodTooLong \u2014 from_interpreter runs 127 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-build-config/src/impl_.rs"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"57c5ea2100114350162092f3ffa06762abc0fe510b732fc48a1f535c028042d5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyo3_ffi_check::main: FunctionTooLong \u2014 pyo3_ffi_check::main runs 127 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/src/main.rs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0dd97d4419b43f1d1716c72e633e0c94927bcc6b9744e4b712481a1cb50da6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyo3_macros_backend::pyclass::impl_complex_enum: FunctionTooLong \u2014 pyo3_macros_backend::pyclass::impl_complex_enum runs 127 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"4be4ab031e6614cbfaab4474cfb23382140a47749356d914176954a0c4a19fc5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/introspection.rs: FileTooLong \u2014 631 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 131 over it, 1.26\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/introspection.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f9f73af659a9ebf8a1751147e322d6c71d5c1d15d5583d60ff0431fe96724ad"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Bound: TooManyMethods \u2014 37 methods, declared across 4 files: src/instance.rs (33), types/any.rs (2), internal/get_slot.rs (1), types/iterator.rs (1). The bar is 30 methods; this is 7 over it, 1.23\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. This type is on a published API surface \u2014 a cargo-semver-checks gate in CI (.github/workflows/ci.yml) declares its compatibility contractual \u2014 so moving members onto a smaller type is a breaking change for every consumer, not a local refactor. To reduce it, treat the split as an API migration: move each cohesive group onto its own published type and keep the old members as deprecated forwards for a deprecation period, removing them at the next compatibility break. Where the surface has to stay as it is, that is a decision to record rather than a change to make."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/instance.rs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"1425b399b21fb281ae9eb512fe53ea5101936d11e00896e56e5e685ca29ee529"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: types/datetime.rs: FileTooLong \u2014 614 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 114 over it, 1.23\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/datetime.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3ae9fb04e02a93df978ce54bc49495b4f6767231f5e4a3081908280ed98cf7e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: types/any.rs: FileTooLong \u2014 608 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 64% of them inside a single declaration: Bound (2 blocks, 848-1456). The bar is 500 significant lines; this is 108 over it, 1.22\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/any.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e6bb35d1daa0e104e110dcbcd8b804af26314b96993e68df65354bf3d1f87d9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: PyNumberMethods: TooManyFields \u2014 36 stored fields. The bar is 30 stored fields; this is 6 over it, 1.20\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/cpython/object.rs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"21061e4635b843607ebf380c56449e409a6e56439b2f413fc9bd1873a2c0bddc"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: PyNumberMethods39Snapshot: TooManyFields \u2014 36 stored fields. The bar is 30 stored fields; this is 6 over it, 1.20\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/internal/get_slot.rs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1824f0029c9085a29c85c47625bfcf816f96d1286d8fa0c394d24eed966678"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/object.rs: FileTooLong \u2014 590 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 90 over it, 1.18\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/object.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c068cdb8dc5c3eba28f781f7f63749b22c82d7be896eeb6d702149658c692a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyo3_macros_backend::pymethod::impl_py_setter_def: FunctionTooLong \u2014 pyo3_macros_backend::pymethod::impl_py_setter_def runs 116 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pymethod.rs"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"c459c8e71d63f3fd116e838c9147264ad2c2ee2734f389860ab8f9cf97077f61"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: std/num.rs: FileTooLong \u2014 567 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 67 over it, 1.13\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/conversions/std/num.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9d397acae94843f28433703965114b6704a39835200bb8353e7ed7a52f203e1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/exceptions.rs: FileTooLong \u2014 564 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 64 over it, 1.13\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/exceptions.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"396e0ae33b1e4317fa53be5b7163d5e8f3cfde62c569da2eebda6d9c20f0adbd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: InterpreterConfig: ClassTooLong \u2014 449 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 26 methods, 2 blocks, lines 146-922. The bar is 400 significant lines; this is 49 over it, 1.12\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-build-config/src/impl_.rs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff918a4c5462dd3be8ac9f45205323a2777d3362105e8013c91428831c7687f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyo3_macros_backend::pyfunction::impl_wrap_pyfunction: FunctionTooLong \u2014 pyo3_macros_backend::pyfunction::impl_wrap_pyfunction runs 111 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyfunction.rs"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd0eef942fe4f01656fc1a4a6105cea7fb1046d68726ae49f7cceeb4245e9cfc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/module.rs: FileTooLong \u2014 553 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 53 over it, 1.11\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/module.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5a73b8a9e558a4e3be0011cee9bea5354fbc3719e238dc8d055ce1e227242da"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyo3_macros_backend::pymethod::generate_method_body: FunctionTooLong \u2014 pyo3_macros_backend::pymethod::generate_method_body runs 109 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pymethod.rs"},"region":{"startLine":1565}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6b61347dcd2789a11312ae2b3b089f9434610e5ed3c60a655ed2646bf5a042"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/datetime.rs: FileTooLong \u2014 543 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 42 free functions. The bar is 500 significant lines; this is 43 over it, 1.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/datetime.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd52bd09e71ba2008a14945a00a25a536cf4e4f7756d3d6bf645735f199dc2e7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: cpython/unicodeobject.rs: FileTooLong \u2014 538 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 38 over it, 1.08\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/cpython/unicodeobject.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e1730eeb6b0f2258b4ae4c159c7e0f935583fdf0d933cc897dd122dabedc844"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyo3_macros_backend::params::impl_arg_params: FunctionTooLong \u2014 pyo3_macros_backend::params::impl_arg_params runs 104 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 4 over it, 1.04\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/params.rs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aede72a5064621b317137f33b4f19c5dc5232800cc34008da338474801ac078"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PyErr: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\u00D7 the bar. This type is on a published API surface \u2014 a cargo-semver-checks gate in CI (.github/workflows/ci.yml) declares its compatibility contractual \u2014 so moving members onto a smaller type is a breaking change for every consumer, not a local refactor. To reduce it, treat the split as an API migration: move each cohesive group onto its own published type and keep the old members as deprecated forwards for a deprecation period, removing them at the next compatibility break. Where the surface has to stay as it is, that is a decision to record rather than a change to make."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/err/mod.rs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3fd3fd4b27b7f381fae9eff88369aedd685d18d13097512150d6918cc5b296"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: types/dict.rs: FileTooLong \u2014 506 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 6 over it, 1.01\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/dict.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35083534d003f670ece216b04de16bd70496652875af423d91ab37de58867bb8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/stubs.rs: FileTooLong \u2014 502 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 2 over it, 1.00\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a123785f08660897d348d10a6114b7deea65becc52c3ce387bb1b0beeffb64e"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (28 shared lines): pyo3-macros-backend/src/frompyobject.rs:510-598 | pyo3-macros-backend/src/intopyobject.rs:488-625 \u2014 These two members are variants of one another: 28 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"aada649a087b9e08d869474e0ae94891597b3373ce7c1462e3ac92ac065b2981"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): src/types/dict.rs:242-256 | src/types/frozendict.rs:191-205 | src/types/frozenset.rs:178-195 | src/types/set.rs:167-181 | src/types/set.rs:186-200 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/dict.rs"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6336141d3844d02b2a74492b24208745ecff1e3488b3d3847c1e5e6cd63ab9c"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): pyo3-macros-backend/src/derive_attributes.rs:75-96 | pyo3-macros-backend/src/pyclass.rs:207-262 | pyo3-macros-backend/src/pyclass.rs:904-922 | pyo3-macros-backend/src/pyfunction.rs:302-327 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/derive_attributes.rs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"d01d43dc22391051902129812bc5faaa8b7c1d133927099004125ec6f1603c11"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (40 lines \u00D7 2): pyo3-macros-backend/src/pyclass.rs:2021-2060 | pyo3-macros-backend/src/pyclass.rs:2086-2125 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":2021}}}],"partialFingerprints":{"codehealthFindingId/v1":"f03a41ff8f033da79e8926c9018d255d52c00536d8f67e703428c3d5dcf7b336"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): src/types/datetime.rs:582-602 | src/types/datetime.rs:785-805 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/datetime.rs"},"region":{"startLine":582}}}],"partialFingerprints":{"codehealthFindingId/v1":"74188e02622604b2b31ec84cfc810f2f1d0e2732be7315ef9fae5d018abe1bd7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): src/types/dict.rs:270-286 | src/types/frozendict.rs:219-234 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/dict.rs"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"188d4edea0d2c8c28fd122e27890952fe2b845dc2904e5d637d74c49c77bb591"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): pyo3-ffi/src/cpython/object.rs:53-67 | pyo3-ffi/src/pybuffer.rs:32-46 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/cpython/object.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"17dc3f4914ac82cd6298f7685ae208bcdef7609f68402e9d246e9c94fcd295de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): pyo3-macros-backend/src/intopyobject.rs:249-263 | pyo3-macros-backend/src/intopyobject.rs:312-326 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/intopyobject.rs"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"dee6f50aa763b616eae33ee58cc2c268fdc45b56954f21b1bb7d3a18851d3b1b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): src/types/datetime.rs:566-580 | src/types/datetime.rs:769-783 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/datetime.rs"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"956ac15747eabb69e918f3aa682f08cdc2ce9428e0b44ea6d4d1507a5f591d0f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 2): pyo3-macros-backend/src/pyclass.rs:1501-1514 | pyo3-macros-backend/src/pyclass.rs:1718-1729 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1501}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dbbd6c736275a2a4be4be43331530df10ea2a6afa8ac89ce8aa960ede081d37"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): pyo3-macros-backend/src/pyclass.rs:2000-2012 | pyo3-macros-backend/src/pyclass.rs:2067-2078 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":2000}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f59253943c43bb06a6a061004056587b8dc6d884baa92e261a1db3d7ec2c5e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5): src/types/dict.rs:245-256 | src/types/frozendict.rs:194-205 | src/types/frozenset.rs:184-195 | src/types/set.rs:170-181 | src/types/set.rs:189-200 \u2014 there are 5 copies across 4 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 5 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/dict.rs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"704a373652f22bb5ca406863913089f0dfec29d4bf53da0e13a998c1b2016e3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): pyo3-macros-backend/src/derive_attributes.rs:77-88 | pyo3-macros-backend/src/pyclass.rs:209-220 | pyo3-macros-backend/src/pyclass.rs:906-917 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/derive_attributes.rs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"7984652d668ebd2b4e59115800527e2dc368b91d690b67ed2d23a7779a189961"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyo3-macros-backend/src/frompyobject.rs:165-176 | pyo3-macros-backend/src/intopyobject.rs:83-94 \u2014 before extracting anything, compare \u0060pyo3-macros-backend/src/frompyobject.rs\u0060 and \u0060pyo3-macros-backend/src/intopyobject.rs\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"0358465436cfadb7a0cb911098790d70f595ffef6581e24c7e9ed4c107ca0d45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): pyo3-macros-backend/src/frompyobject.rs:518-529 | pyo3-macros-backend/src/intopyobject.rs:499-508 \u2014 before extracting anything, compare \u0060pyo3-macros-backend/src/frompyobject.rs\u0060 and \u0060pyo3-macros-backend/src/intopyobject.rs\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b429357bd69b2c92e9501bd374d25092c5184ab157be538702b6ef860c98804"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyo3-macros-backend/src/frompyobject.rs:553-564 | pyo3-macros-backend/src/intopyobject.rs:570-581 \u2014 before extracting anything, compare \u0060pyo3-macros-backend/src/frompyobject.rs\u0060 and \u0060pyo3-macros-backend/src/intopyobject.rs\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":553}}}],"partialFingerprints":{"codehealthFindingId/v1":"19f79774ef312b2db4cb9ca317cdcc50fc5d395aad9cb778f179726b31e4c5cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyo3-macros-backend/src/pyclass.rs:1166-1177 | pyo3-macros-backend/src/pyclass.rs:1280-1291 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1166}}}],"partialFingerprints":{"codehealthFindingId/v1":"90f57e67b3082c5d2910c44cef5d49509893168f7f5374ed572a310b76c55060"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): src/types/any.rs:1397-1408 | src/types/sequence.rs:311-322 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/any.rs"},"region":{"startLine":1397}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6fb4f32924a1a05234d0db1c8d0362f9bf05c50e7fd38c0e16e5df24b33ce6e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): pyo3-macros-backend/src/derive_attributes.rs:76-86 | pyo3-macros-backend/src/pyclass.rs:208-218 | pyo3-macros-backend/src/pyclass.rs:905-915 | pyo3-macros-backend/src/pyfunction.rs:303-313 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/derive_attributes.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"98b6e92fcfebb13ede57786e8efd288b1776f6490a61f6167b44658807588f79"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 2): pyo3-macros-backend/src/pyclass.rs:519-527 | pyo3-macros-backend/src/pyclass.rs:1337-1347 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"a17d9ae953b5333b26762a3e7238c9077544f0ba14877815a20b8f6d11316a29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/impl_/pyclass.rs:1411-1421 | src/impl_/pyclass.rs:1452-1462 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pyclass.rs"},"region":{"startLine":1411}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad498f5142ec41fe56df556653d0434f5a1b3eff2ae8ae7371c45bf189670444"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyo3-macros-backend/src/pymethod.rs:786-795 | pyo3-macros-backend/src/pymethod.rs:881-890 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pymethod.rs"},"region":{"startLine":786}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7fa761b7d411fa0d5852e710bfddd88e3487c1642cb64608566a52147b9f676"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/types/any.rs:1281-1290 | src/types/dict.rs:300-309 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/any.rs"},"region":{"startLine":1281}}}],"partialFingerprints":{"codehealthFindingId/v1":"f488a713b650f93c7c3f280aa0eb40d47347d75079fb8a42c22a9773066abe7e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/types/sequence.rs:292-301 | src/types/sequence.rs:331-340 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/sequence.rs"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf3b0c38fd899476ff6aaf4eec6569f881f609bed5ecac2a1da3a4ff711e3ac2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pytests/src/datetime.rs:130-138 | pytests/src/datetime.rs:146-154 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pytests/src/datetime.rs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a3b7dc03c6c021b1a091cc64ffda94c9ba785ef6208291fbfd1d0c3dacac390"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): pyo3-macros-backend/src/pyclass.rs:1137-1144 | pyo3-macros-backend/src/pyclass.rs:1266-1273 | pyo3-macros-backend/src/pyclass.rs:2773-2780 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1137}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dd77fd1f648b6905370d02034a3daae7bd6fa25e16f5b640bc346ba985ed643"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyo3-macros-backend/src/method.rs:77-84 | pyo3-macros-backend/src/method.rs:87-94 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"27581dab1e54883b54a71d51ba2a70b4493a8e14ab37120a90fda26b9a2e5066"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyo3-macros-backend/src/module.rs:412-419 | pyo3-macros-backend/src/pyfunction.rs:426-433 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/module.rs"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"b699699581c76499876ce4ec8982b558f04292983b0fc2388b4804a24be3dd3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyo3-macros-backend/src/pyclass.rs:2836-2843 | pyo3-macros-backend/src/pyclass.rs:2846-2853 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":2836}}}],"partialFingerprints":{"codehealthFindingId/v1":"30824b7f3e428dab056c71dd69bc87b2b8ed74af185fd6e84d4d9ca8a0a4bd2b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): pyo3-macros-backend/src/module.rs:413-419 | pyo3-macros-backend/src/module.rs:501-507 | pyo3-macros-backend/src/pyfunction.rs:427-433 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/module.rs"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d80641df88249b528d50be988b4fd43460c106da01fde8dd6c4482734e4ff09"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyo3-macros-backend/src/introspection.rs:284-290 | pyo3-macros-backend/src/introspection.rs:307-313 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/introspection.rs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f0e963ad6a1d16f8512bb2c4243c39f3357a82e592d30323e1d7e0f3921370d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/err/mod.rs:358-365 | src/err/mod.rs:544-550 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/err/mod.rs"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d49f5a775a13c29ee460a127c3420ebdbf303fbd5fc7f4bdbbef55ababe5d21"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyo3-ffi-check/macro/src/lib.rs:134-139 | pyo3-ffi-check/macro/src/lib.rs:648-655 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"8892b74edab406d2ce783a683245cccc9327039f60de5cdd09d358bec21a8795"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyo3-introspection/src/stubs.rs:312-317 | pyo3-introspection/src/stubs.rs:328-333 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"00b412d4b0decfa0c8231d96c3cbb5461f443588074cbef893740e24bd747cdd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyo3-macros-backend/src/frompyobject.rs:511-516 | pyo3-macros-backend/src/intopyobject.rs:489-494 \u2014 before extracting anything, compare \u0060pyo3-macros-backend/src/frompyobject.rs\u0060 and \u0060pyo3-macros-backend/src/intopyobject.rs\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":511}}}],"partialFingerprints":{"codehealthFindingId/v1":"769326e99350f482de1ad886e53b0179aaffd8703b58a0b37ee35fe1fc1ac83e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/impl_/pyclass.rs:1431-1436 | src/impl_/pyclass.rs:1472-1477 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pyclass.rs"},"region":{"startLine":1431}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3d76014600dbc3eb18eefde24d704e76f61c857618c4a4c73934d2f44c7b008"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): src/types/frozenset.rs:163-173 | src/types/set.rs:152-162 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/frozenset.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76b3e93dfb4ccf5a611dcd6df6b3e30e8c189f75ef456cdfbaf4c14111c7ff5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/types/mapping.rs:60-64 | src/types/sequence.rs:59-63 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/mapping.rs"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f3d4ca38a54f12a292a4ecf949d6901ed8fa135f6f16c37ea6ef21566aa8a5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyo3-ffi/src/cpython/bytearrayobject.rs:37-47 | pyo3-ffi/src/cpython/listobject.rs:31-41 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/cpython/bytearrayobject.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb56e680b9d059423e94d37935cae952b4920d239e253f8aee58c5c17194fd0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyo3-macros-backend/src/frompyobject.rs:103-109 | pyo3-macros-backend/src/intopyobject.rs:473-479 \u2014 before extracting anything, compare \u0060pyo3-macros-backend/src/frompyobject.rs\u0060 and \u0060pyo3-macros-backend/src/intopyobject.rs\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d1ed2004bccb9c5630fdd6b4edb134ed75c066d0a530363762dd948d0c73b5d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyo3-macros-backend/src/frompyobject.rs:482-489 | pyo3-macros-backend/src/intopyobject.rs:388-395 \u2014 before extracting anything, compare \u0060pyo3-macros-backend/src/frompyobject.rs\u0060 and \u0060pyo3-macros-backend/src/intopyobject.rs\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 57 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad441d2d09bb03aa2d779e4e09f2d52a7e5ef106bb3c6abc4d9965ebab37f17"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): src/types/any.rs:1355-1359 | src/types/mapping.rs:125-129 | src/types/sequence.rs:171-175 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/any.rs"},"region":{"startLine":1355}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5892b5b25f95d0e8ff5583951aec18ac1668fb2f4db19ebf3c162923dd0d5e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/types/any.rs:1370-1374 | src/types/typeobject.rs:200-204 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/any.rs"},"region":{"startLine":1370}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ec3a784af63dd454d579b2a60d005997a50b7c1e9b3e692b2e15d70a0cf88d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): src/types/bytearray.rs:45-53 | src/types/bytes.rs:83-91 | src/types/string.rs:182-190 | src/types/string.rs:196-204 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/bytearray.rs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"3724fb1c6a16156b984eae1b9dc179e0d6034ba27f75c7a3377cfd7eb40c1983"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): src/types/list.rs:321-327 | src/types/sequence.rs:227-233 | src/types/tuple.rs:281-287 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/list.rs"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"138542fa40d3d5f82b2579c940476640536376f7f3a46287342cd6e538df7e9f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/types/list.rs:358-367 | src/types/sequence.rs:266-275 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/list.rs"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bf1a05e713ba872b8136e6a6ae1e0b0222559f34e236e5b977095262a71bf45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/types/weakref/proxy.rs:78-86 | src/types/weakref/reference.rs:87-95 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/weakref/proxy.rs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f6abe073485e1cc35695c9b5268c58312fce41fd968a18a569de28a94dfdd5d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): pyo3-ffi-check/macro/src/lib.rs:33-41 | pyo3-ffi-check/macro/src/lib.rs:131-136 | pyo3-ffi-check/macro/src/lib.rs:644-650 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c23ed796f4713f02f06f47d76a7283cb1d4f3438b5c4150c98173313da774c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): pyo3-macros-backend/src/method.rs:752-760 | pyo3-macros-backend/src/method.rs:765-773 | pyo3-macros-backend/src/method.rs:778-786 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":752}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0a24cd56cb87af088e0e8af8c2dcf1d2e9a0a575d9233842561ff36c38adc70"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): src/types/weakref/anyref.rs:332-336 | src/types/weakref/proxy.rs:171-175 | src/types/weakref/reference.rs:179-183 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/weakref/anyref.rs"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4f705be876c31d56997c1a73a582613b3f28ef93c48a229596550014e5cf21"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyo3-macros-backend/src/pymethod.rs:1605-1609 | pyo3-macros-backend/src/pymethod.rs:1659-1663 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pymethod.rs"},"region":{"startLine":1605}}}],"partialFingerprints":{"codehealthFindingId/v1":"e25bf3fd7e6d4e6993f62c234c84315a9799ea44e9b9d7433fa11d0cc8871912"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyo3-ffi-check/src/main.rs:179-184 | pyo3-ffi-check/src/main.rs:197-202 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/src/main.rs"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3cc5399ae49507e8949524ce6c172b9e790c8a0d6a47a3f644992e391ce0975"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201321 lines \u00D7 2): noxfile.py:1487-1502 | noxfile.py:1509-1529 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060noxfile.py:1487\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060noxfile.py:1502\u0060 calls \u0060log\u0060 and \u0060noxfile.py:1530\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":1487}}}],"partialFingerprints":{"codehealthFindingId/v1":"527f30cc3d3a967ef84bdb9a7e11b4944b1c33707f9a80326b1480429412f24a"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): examples/decorator/noxfile.py:8-16 | examples/getitem/noxfile.py:8-16 | examples/maturin-starter/noxfile.py:8-17 | examples/plugin/plugin_api/noxfile.py:8-16 | examples/word-count/noxfile.py:10-18 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/decorator/noxfile.py"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b3fba27e84a357ec9c08342aa87d7aa787e77ffa7de478192380f8e3fe3e633"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 5): examples/decorator/noxfile.py:8-16 | examples/getitem/noxfile.py:8-16 | examples/maturin-starter/noxfile.py:8-17 | examples/plugin/plugin_api/noxfile.py:8-16 | examples/word-count/noxfile.py:10-18 \u2014 \u0060examples/decorator/noxfile.py\u0060 and \u0060examples/getitem/noxfile.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 1 separate duplicated blocks between them, totalling at least 10 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/decorator/noxfile.py"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"cadb9867827baebdd23fda135d81656d9f6e1a72f466e9a1d7598bb11bb31325"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: pyo3-macros-backend: pyo3-macros-backend: abstractness 0.04, instability 0.00, distance 0.96 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a2c14d509291529127ee8aa666a3928b1f6be79efe0ac50c5a28a81a91cd4d74"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: pyo3-build-config: pyo3-build-config: abstractness 0.07, instability 0.00, distance 0.93 \u2014 zone of pain \u2014 concrete and depended on by 7 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"30c968ae20df5d6458d7c46b427e53088578dad40657cb415dff1ea6c8b137b8"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: pyo3-ffi: pyo3-ffi: abstractness 0.01, instability 0.25, distance 0.74 \u2014 zone of pain \u2014 concrete and depended on by 3 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a9527def08eaaf8c9e98963528bf9029cd552fd0d0b78916995b63a0ef3445f8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: noxfile.py: noxfile.py changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in noxfile.check_feature_powerset at line 1614. 4 of those changes were fix/bug commits, and the other 17 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- noxfile.py\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"noxfile.py"},"region":{"startLine":1614}}}],"partialFingerprints":{"codehealthFindingId/v1":"50ea048c20d233e4e818f57e5238f9b27f402d3014e063cf1c150f76e5b05f2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyo3-introspection/src/stubs.rs: pyo3-introspection/src/stubs.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in Imports::serialize_expr at line 478. 2 of those changes were fix/bug commits, and the other 6 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- pyo3-introspection/src/stubs.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"18b131d96ad6905287d67ef6d596db07bddd0d8c61519ecc3e743a339f96f188"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyo3-ffi-check/macro/src/lib.rs: pyo3-ffi-check/macro/src/lib.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in pyo3_ffi_check_macro::for_all_fields at line 190. 4 of those changes were fix/bug commits, and the other 4 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- pyo3-ffi-check/macro/src/lib.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b40f2cf0f79e7b575c39e2660a87c91068a5a584352c62045935da93d4ff375"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyo3-macros-backend/src/pyclass.rs: pyo3-macros-backend/src/pyclass.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in PyClassImplsBuilder::impl_pyclassimpl at line 2789. 2 of those changes were fix/bug commits, and the other 9 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- pyo3-macros-backend/src/pyclass.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":2789}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce9323125e0e4aa496bcca028cef54c1e2f6ec228ae91e44b22c5dcf002e5d0d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyo3-macros-backend/src/pyimpl.rs: pyo3-macros-backend/src/pyimpl.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in pyo3_macros_backend::pyimpl::method_introspection_code at line 396. 1 of those changes was a fix/bug commit, and the other 5 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- pyo3-macros-backend/src/pyimpl.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyimpl.rs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae062909e948101fbbed24819e6be86ffdccdc4ea27ed6c3e64060fcee018c9e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyo3-macros-backend/src/module.rs: pyo3-macros-backend/src/module.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in pyo3_macros_backend::module::pymodule_module_impl at line 100. 1 of those changes was a fix/bug commit, and the other 2 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- pyo3-macros-backend/src/module.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/module.rs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcef457fcb414850b879d032c3938832ecd4101f4fa974b475a907270c638ada"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyo3-macros-backend/src/method.rs: pyo3-macros-backend/src/method.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in FnSpec::get_wrapper_function at line 818. 3 of those changes were fix/bug commits, and the other 3 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- pyo3-macros-backend/src/method.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":818}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b0233146c6a88e83e430e524bb94a77512cbf3d3d32f0e9e5a87ead95069e02"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyo3-macros-backend/src/introspection.rs: pyo3-macros-backend/src/introspection.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in IntrospectionNode::add_to_serialization at line 392. 2 of those changes were fix/bug commits, and the other 2 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- pyo3-macros-backend/src/introspection.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/introspection.rs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a9147e8175421f99032ab7cbd24b27c32d4b72c00b4653e46d795819c398f6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyo3-macros-backend/src/py_expr.rs: pyo3-macros-backend/src/py_expr.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in PyExpr::to_introspection_token_stream at line 218. 1 of those changes was a fix/bug commit, and the other 2 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- pyo3-macros-backend/src/py_expr.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/py_expr.rs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b376f8d08687ddd1dc18214ae99c0d0d5c5d3ba0b715a13adb197d09581a556"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/inspect.rs: src/inspect.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in PyStaticExpr::fmt at line 256. 1 of those changes was a fix/bug commit, and the other 1 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 21:09:00 \u002B00:00\u0027 --until=\u00272026-09-28 21:09:00 \u002B00:00\u0027 --full-history --no-merges -- src/inspect.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/inspect.rs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"219579877b658d3b15d7e4a1158583fdeb8a26ae930d4eb79d068edbd4f8a359"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 2 significant file(s) lose their only recent owner: guide/glossary_linker.py, pyo3-ffi/src/cpython/pyatomic.rs. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a2e3b709ca273f581e8945a79e460847d3725b44b6d38115617c9d2e99440a6f"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 1 other contributor(s) are each the sole owner of a small amount of code below the off-boarding threshold \u2014 folded into the bus-factor score and metrics (3 single-owned of 208 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 208 of the 319 production source files in this repository met that bar). They are anonymized user #2 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: PyPy \u0026 GraalPy do not support the Stable ABI. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-build-config/src/impl_.rs"},"region":{"startLine":2337}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a9e5230e8c31fd4735c5728174e4067e0f3cc580dbd6d2147955f9c256c5d88"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: probably should deprecate using this variable at all, seemingly only used in \u0060add_python_framework_link_args\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-build-config/src/impl_.rs"},"region":{"startLine":4003}}}],"partialFingerprints":{"codehealthFindingId/v1":"17b590c04c17e971942d4d02fe2bc556d78be62710e1e49f3a76efae1881533b"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: for many of these \u0060not(PyPy)\u0060 cases, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc0c8fa4d910ecda1014609c25643a27e0e0b207f5d76ba0e952036108ea6fb5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: probably need to clean these up \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"2205f863b49018cda2a6f98461f89b52b6fee90e8276b226b263684264b6a62f"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: probably outdated definitions that fail to build, need investigation, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"db03aa7d91ba855700eb294eb43cf5ec25c3fbef8b39cc5bd64bd64727e65d5f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: PyPy 3.12 declares these symbols in its headers but does not implement them? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":601}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3d9488949512e96b15d26ca593f746be86a2e6f03931d69c0a2b3ee1a5d8ef1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: deprecated backwards compatibility aliases to be removed in PyO3 0.31 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac48f8c94903c3b9962035cb6e050dbc4036a8514f9d2749de82b0f57f5a8d80"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: can probably sniff arg types by binding sniffers for each argument position and then passing \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/src/main.rs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"113e58f9287daf7a1ae384f59a4401648aa905d9e1c048e873ad01bb84efbe76"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: can probably sniff arg types by binding sniffers for each argument position and then passing \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/src/main.rs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"e416ff8591119be0276783e639ae81e9da6e3f5b7a23be3e24b972b287d9c5fa"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: this should probably be done with better configuration in pyo3-build-config \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/build.rs"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65ec64b9d52d1cd10fc40e89465cffa38047bfd6158cc2907336c9e39d2c445"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: PyO3 is depending on this symbol in \u0060reference.rs\u0060, we should change this and \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/weakrefobject.rs"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"0add187ca6db093316665240cc96e39b48f8601e2bd63886a6080507bc88fd1f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Py_SET_REFCNT \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/refcount.rs"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ef67c72a709c12525fb96a83eea9a658887a038d58c7f594ad60fad8c3c04a8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: reimplement the logic in the header in the free-threaded build, for a little bit of performance. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/refcount.rs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc6349e0e74f9d8b553d20e0dbe2ec8f851393fd6aa39fb9d5e0d6b4265efbde"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: reimplement the logic in the header in the free-threaded build, for a little bit of performance. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/refcount.rs"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"087bfc741dc7ab3351b88dc7f95634b2436ac035d12e3dcc2bdfb6fb182a4415"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: deprecate this now MSRV is above 1.77 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/lib.rs"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"c16733eb31ba091d678ccbd986b60f604e0dbea47ac05fb3a2af755a05188525"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove (see https://github.com/PyO3/pyo3/pull/1341#issuecomment-751515985)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/floatobject.rs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bca757548f4c627eb35adbab8d1b2962ad1eb6125a0935f4590531d353feaf8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove (see https://github.com/PyO3/pyo3/pull/1341#issuecomment-751515985)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/dictobject.rs"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"96318f09ffe36556b5645ecb7dfc0a99fa2e1cdf6cc1e81c944a1ddba29deee8"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: these constants should probably be \u0026CStr, if they are used at all \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/cpython/compile.rs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"7caa2faa288de492fcd8da9ece0ebf24d5a37652a7e3475034437c405e7f982c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: reduce the number of \u0060_Py*\u0060 exports from pyo3-ffi over time \u2014 the fewer \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/impl_/macros.rs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c15ad3f509dcb01d8e491b9ffb57a4f12ef18010e0b62d741d7075d97b52570a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we use currently a format like Foo2. It might be nicer to use something like ModFoo \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"a78c8b2e39b0fde429953b1af8638f2f0b0e254c5162ad49bd60a3be0b8f8769"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: addressing #6024 could allow to simplify this by using type"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pymethod.rs"},"region":{"startLine":1753}}}],"partialFingerprints":{"codehealthFindingId/v1":"827d275e151731e92864a130366bb99c3aa7fadae8dfc8fdfc650a934f49335c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this might create a naming conflict \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyimpl.rs"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bcb5123502ab14d886d288b8edfdac78bc8faf9d107c824463981c03c871864"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: not sure this can happen \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyimpl.rs"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca67f5e685d5d4b82f0b3618ef5e278ce0075d65be47e8303d2a752aa1ed079f"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // Hack to return Self while implementing IntoPyObject \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyimpl.rs"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36263bcc13f7c850ddd4a341df85a22e5a10260ee2c8d336c21a033a9b1d261"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use typing.Self? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyimpl.rs"},"region":{"startLine":505}}}],"partialFingerprints":{"codehealthFindingId/v1":"c91b3ecc0844d30872e19567465740e037f5bb170bd532d62c28879de9fcc907"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: unused for now, intended for pyo3(deprecated) special-case \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyfunction.rs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"357970fbc24c3abbce7c2df093c11c73e40086b63c031940fc75cf35c29865d4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mkovaxx): Unit(PyClassEnumUnitVariant\u003C\u0027a\u003E), \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":749}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccf508276abb746739d2c9c4ab4411e36f0ded2e9b6978e3eeccb006c870e480"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(remove this dead code allowance once __repr__ is implemented \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":925}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0e82d3a7a2eb8070b25dfa8da51d31ed44db3cf4b6d246f110461687cef21b2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(icxolu): switch this to lookup the variants on the type object, once that is immutable \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1145}}}],"partialFingerprints":{"codehealthFindingId/v1":"6754c0fc3c67e30b56ef5596bccee96a22dbec6d4987f2a31fe150eb453251a1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mkovaxx): propagate variant.options \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1310}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d5e501292994de9dfd5d90f36a7e7ec237c1975f308dbc303b5b9421608250e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: figure out correct type \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/pyclass.rs"},"region":{"startLine":1663}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c37660ec907972d29dfd308852f3bd70e4e7122ade2e6591f05f326d03785e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement ByteStr and CStr \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/py_expr.rs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb3e03d2a99c633cb5f249dc52f3f80b5310caa0b50deec486518ed5a55f285e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement using a Protocol? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/intopyobject.rs"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9ac61a8842017d4faf4f0dea4c31545834eaecca65a5f4056bf9fc22b8fa87b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: implement using a Protocol? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/frompyobject.rs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"af4a50bf1655eac8fd62366a85683bcd8512cfbbd5fe4010865c2e9806772a15"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: enable stubtest session.run_always(\u0022python\u0022, \u0022-m\u0022, \u0022mypy.stubtest\u0022, \u0022pyo3_pytests\u0022) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060# REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pytests/noxfile.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c1ba02514fe78acf1739fc7b32a604e66eb5cbecbb141fa5d790ed3c9a959d2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implementations are just for the example and often not correct \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pytests/src/pyclasses.rs"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"514abd7bbdaba4978f3a53f5dcd94e53c9f612994ed0aafb9bee94a20a1004fa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: on the freethreaded build, consider wrapping this pair of operations in a \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/sync.rs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc984d4944a021031ec5e1b6d0d6706f4c22d659004a4385cee21551c97dc68"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment repeated across 30 files: The identical TodoComment appears in 30 files (30 occurrences) \u2014 almost certainly one boilerplate line from a single migration or decision, not 30 independent debts. Fix the systemic cause once rather than file-by-file. Text: \u0022// TODO https://github.com/PyO3/pyo3/issues/5487\u0022. Source code is not a task system: track the cleanup where tasks live. (Every occurrence still counts toward the score and metrics.)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pyclass_init.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"de0ef5f451ea1227c8192f1a8313b7f3e21db113799591d823e8ac3be02b8a4d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: once the GIL Ref API is removed, consider adding a lifetime parameter to \u0060PyRef\u0060 to \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pycell.rs"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"6397318ab22120950744169a417c5c6658e400bbcbcf5d5b02c89a36db8de449"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: once the GIL Ref API is removed, consider adding a lifetime parameter to \u0060PyRef\u0060 to \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pycell.rs"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"89eb0903e833aa102c815154ae9527e44f582069659057884b7ed4a041ecc44d"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: /// FIXME: this currently unconditionally allocates a \u0060CString\u0060. We should consider making this not so: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/macros.rs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca6c1d0065d427b6823d7b47faae1e481c394347471ed6085040afc19a7f1b06"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME https://github.com/rust-lang/rust/issues/121621#issuecomment-1965156376"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/lib.rs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"53df4c6d72fd9d1b4dcfbc8fb55145800bf3f5ead8a28be86d9e091a81814ed4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use START.wait_force() on MSRV 1.86 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/interpreter_lifecycle.rs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"59174904c48cdc11942bed7324ff64f7684e5e0b446c440cb0866d89d79dd7dc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: may not be needed on Python 3.15 (https://github.com/python/cpython/pull/146303)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/interpreter_lifecycle.rs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cdece5b05bc4865f579ac717bcdd5e5b9324a6394836161d8f5bca791524f6d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use Box::into_non_null when stabilized \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/internal_tricks.rs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"83f47e55dd78058b62e9f9f4ac58ddfa678172aef5f61f73bfb1e4f46e73fa77"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove this when the top-level is \u0022warn\u0022 - https://github.com/PyO3/pyo3/issues/5487"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/instance.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7870fe6398b3bb8eb10a04dc8a01ffad4e84089e7256bde56a9852866a964a1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use copy_from_slice with MSRV 1.87\u002B \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/inspect.rs"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2406d73eb239588e627ae6a489095a526d70f9632305c04f45ec1a9b2d9e4f1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO remove once implementing GC traversal is unsafe \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/buffer.rs"},"region":{"startLine":764}}}],"partialFingerprints":{"codehealthFindingId/v1":"6575e2ea129ea0b9f5c167d56db9b156d43138a67a27f0ce63fb76dfc295ac0e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: it might be nice to use the \u0060type_input()\u0060 name here once \u0060type_input\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/conversions/either.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba75f13ec86e7d6fe7dcc04aee806df97ac29123e8f73880735042a5560a671d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: it might be nice to investigate using timestamps anyway, at least when the datetime is a safe range. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/conversions/std/time.rs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"c91b0bfc424ac0bde0b2ba12073fd8451cf2e56545aec0948cf763749af2e1ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use \u0060core::array::try_from_fn\u0060, if that stabilises: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/conversions/std/array.rs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"838df0a1ca33bd20d687552afb7353462e9b6207aa384880c3a63bf2b978dd64"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use \u0060MaybeUninit::array_assume_init\u0060 if that stabilises in future? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/conversions/std/array.rs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"a64e17fe3c50f84a26a1d0dbfddda62f1e0eaef4b915d8d8405a80178bb7ddd7"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: \u0060arguments\u0060 should become fallible \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/err/mod.rs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b424bf2f4f17266c1198737bd0c6f5ec32e58bc18178e337fd61acca4584999"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: //FIXME(icxolu) remove unwrap \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/err/impls.rs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"e23ca2b6452ef4cbc3e5993470bafa83830681373bb04ef6edd97d7cbcb1dd90"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME(icxolu) remove unwrap \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/err/impls.rs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"51a9f82bd869c77d6852f5b12533b9476d4e7f1d10c37b5bd9c32005e26ce751"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME(icxolu) remove unwrap \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/err/impls.rs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d0ba9a5970f34e9558567cdd12398c67ac1cc5e9d7bce5ca861ceb4cbadddc6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: it should be possible to use the Py_mod_multiple_interpreters slot on sufficiently \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pymodule.rs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"e512de622b7c1d1cdd2cb080959590fdc5e7c207a4face98b91ef86ec2e67496"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO: There are possible optimizations over looking up the base type in this way \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pymethods.rs"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"08fbfb570b02d44454219f11ca897062656ff1d0657ff9341b73242da0b2f98e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO: There are possible optimizations over looking up the base type in this way \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pymethods.rs"},"region":{"startLine":551}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3dc26a308e4f8f52c1ce7a29e2a71fe671278c33efcc0907668cde72c172afc"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: return an error if current type not in the MRO? Should be impossible. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pymethods.rs"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"af1aee04471042656f48c657e675a00f36f374cfe1c5d9ff01f3761fcf905983"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: return an error if current type not in the MRO? Should be impossible. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pymethods.rs"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"39cde3bd006f67fd7ed45637301e4b2e4908c6baf6a3adfec7846f01ddb43ae6"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME same question as cython: what if the current type is not in the MRO? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pymethods.rs"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"e78d15ae4290b1b80096c876c85d317575384afae554a8f75b42c95e94458f67"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME same question as cython: what if the current type is not in the MRO? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/pymethods.rs"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ec3a11fd04d584325141424d938dee2a22dc598961b0c75fc9b45e99f19dd73"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO maybe use ExceptionGroup on Python 3.11\u002B ? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/impl_/frompyobject.rs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"42c7cd5b23b214b8cdce9825f10eb08a9a6b97a488f5e9681e2a8c0d0368e049"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: make it possible to provide real arguments to the base tp_new \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/internal/pyclass_init.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"99c2a26701c5e0507844528756d1813155c49b8f977fa59e9e6e9271d329f26c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO replace with cfg_select when MSRV \u003E= 1.95.0 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/sync.rs"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd95e561c3a90b007526e14f269a70e067007a664b885f574ab469d3661c753b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO replace with cfg_select when MSRV \u003E= 1.95.0 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/sync.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"322a7a112f73b87a3271ff3e898154d2dbf7594074274c8c453363f34d80ffc3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO try_lock \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/sync.rs"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5a1460d70173fb49e5823afb5cec3ecc9cce151e9c0fa1410e9a7d717249749"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: there is potentially subtle issues here if the base is overwritten \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pycell/impl_.rs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfc74e278796253e1175a451d687c11037a46d14a9486e958760b838bea7fe5e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: If the PyPy bug is fixed we should remove this workaround and just create \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pycell/impl_.rs"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"74c19a6cfc3331d205c6ef20046693a5bf7f3704e8209db770f179a7474dfbd2"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: should this be using actual_type.tp_dealloc? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pycell/impl_.rs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"e95b3cad79cd63d5245041d9ba2ad4cca7f2a5f78fd6b0fe0470da8cc0af282a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: it would be nice to eventually avoid coupling to the PyO3 statics here, maybe using \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pycell/impl_.rs"},"region":{"startLine":575}}}],"partialFingerprints":{"codehealthFindingId/v1":"f57105434a9f4e2e8cf4e571ef6da8bad3f4ed8995e45f00d3c4ab1de2613afb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: be smarter about merging getter and setter docs \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pyclass/create_type_object.rs"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0a18518aa9868355ce5c938bf9267efd4388239e85e25f0edc5df897fdddb26"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: be smarter about merging getter and setter docs \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pyclass/create_type_object.rs"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"33f8afdb2ec94594638f6f779be7ca510df1d3f608de1e849d6a423166568094"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: return an error if getter already defined? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pyclass/create_type_object.rs"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cc67a3256252c50fcf9dd71e570fa23629f03d7f2fd4474442b8b3e29686e45"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: return an error if setter already defined? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pyclass/create_type_object.rs"},"region":{"startLine":607}}}],"partialFingerprints":{"codehealthFindingId/v1":"7882774c907d2ab22e3d9e4098ea8a1d1aa77abe082d8b8a053635825f5019f7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: be smarter about merging getter, setter and deleter docs \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pyclass/create_type_object.rs"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3fe429933547f49cb60c4e3701ecd523ca23f4b0ddfc84e166f41c634ea80d7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: return an error if deleter already defined? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/pyclass/create_type_object.rs"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"0abdfe7047b125818d781e24504a95665b1c8f1d58f66bc1c72d1763fe94ec5e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this method can probably be deprecated once Python 3.9 support is dropped, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/string.rs"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c4ebf5261c0fbe5ac3e9915b0ea40f2c636009b3b0f23dd64c09d3e99651641"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we might want to remove this \u0060iter\u0060 module and instead just let the \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/mod.rs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d6fd3da4e44ca73bbed236129a035f28b90bc26cecb8602e2f1caed3065752"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: stop leaking the def \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/function.rs"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb83b615f6d3a47a004a98837f3e199899f048abc807d78516c196ebe8fa99a0"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: stop leaking the def \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/function.rs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d09c003b0b552110fc90dac842c6f8d477d6abc60053f9125473de99716a88d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: enable support on free-threaded builds once \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/context.rs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fa653d52ff840f97c9e8b5297a3ec242bf23ca5a573c770fea3e0494e7caefc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: remove this field when \u0060PyCapsule::new\u0060 and \u0060PyCapsule::new_with_destructor\u0060 are removed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/capsule.rs"},"region":{"startLine":633}}}],"partialFingerprints":{"codehealthFindingId/v1":"84159dc9c4ad979c01b8ed3d40c2724774dc5e9b7f18364d99a6576fbcb59d17"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: should not be depending on a private symbol here! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/weakref/reference.rs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"a16e52500e1891a77a1a951f003ab437e008579bf7884022d4e381be5f97eb39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We known the layout but this cannot be implemented, due to the lack of public typeobject pointers. And it is 2 distinct types \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/weakref/proxy.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"aafb1fa850a11a029c2131e69983c8ad1ca3a3994931a5387f44eb0358f51076"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO: UPDATE DOCS \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/weakref/proxy.rs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ea413c438f146b6823f96f0712021f360597fa693ea146e7c20dbf4b24c4b57"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We known the layout but this cannot be implemented, due to the lack of public typeobject pointers \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/weakref/anyref.rs"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6785de6f5676c97298276ded402545c0b11c01b025cf8abbdcffa7e79037759"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME __getattr__ cannot be accessed via the type\u0027s __getattr__ slot0 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_proto_methods.rs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ecf669d5dd517217b7294823bca955f687c579f7f841126fafd194b4847863f"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME __getattr__ cannot be accessed via the type\u0027s __getattr__ slot \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_proto_methods.rs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"61efa91cb9797fc5719b265a27fbf9f65c31693f2b4398271abb5a2a94092279"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: it should be possible to use variable layout to inherit dict on graalpy \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_inheritance.rs"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"bad9bd728a7f7e28eeebc0e7fc2167c6b2e7e326f9df49b50461844bdab735a4"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: should this really need to be the case? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_gc.rs"},"region":{"startLine":673}}}],"partialFingerprints":{"codehealthFindingId/v1":"433bbaa98226960e8beaeda9be90cfbe146742e86724307ce4c8cf206c02fa5d"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME https://github.com/PyO3/pyo3/issues/5211"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_gc.rs"},"region":{"startLine":1118}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c1e81ed0ca357d3082fb112297390c2c571db1255e9fdca33000353f422bce3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO use \u0026self when possible \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/test_coroutine.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"82cff22537f69109d087b78c826aaa29840a35aab74d1bdcc6257c3d67480595"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line decision with no rationale: Explain why PyThread_get_thread_ident is needed (thread identity on non-Pypy builds) and the trade-off of adding it to ffi crate"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6056.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"50907f1cc2f7eff08266b1301264f4d2294e89b748b46c4915d12f7969de9705"}},{"ruleId":"D20","level":"warning","message":{"text":"Decision is a bare \u0022drop support for Python 3.8.\u0022 with no context/problem and no consequences/trade-offs: Add the problem (e.g. end-of-life of PyPI packages requiring it) and the consequences (replacing compatible packages, migration cost)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6128.packaging.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a9519e45084a21171b9563f6572fb4b9aeea8af03ab986899799f5c2c1ca34"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why convert to num-bigint now) and no consequences/trade-offs: Add the problem motivating the change (e.g., high cost of converting from int/float to num-bigint on Python 3.14\u002B), the decision it replaces, and its consequences such as API surface area or compatibility with older code"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6144.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"641cee72c5d4e407ff02b6263d9cb1fb11efadd8c698df770bf042aa98f8e6ce"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision \u0022Add init config to \u0060ffi\u0060 crate\u0022 is present: State why init config matters for ffi (e.g. loading shared libraries or environment variables) and document any trade-offs such as increased startup cost or dependency on a new module"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6152.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6382ddb2eb16e0ec6b16a9b538b2283697bf5b28b0e18f768a261784b1160514"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision \u0022Enable \u0060PyLong(Writer|Export)\u0060 api on abi3 from 3.15\u002B for fast u128/i128 conversions\u0022 is present: Add a Context section explaining why u128/i128 conversion speed matters (e.g., high-performance data loading, serialization) and a Consequences section noting trade-offs such as ABI compatibility with older versions or the cost of maintaining the new API"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6160.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bd425089f049d131407c2d7b2c3cc5029073fd900d5c03f8fe37b02448597f7"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line decision with no rationale: Add why FromPyObject was deprecated (e.g. generated code duplication) and the trade-offs of removing it (no longer able to convert from Python objects in this case)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6188.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54bb7dea7d9c430943cf8bf5a1eb019895f8c8b73d917b06e7da0588e0052ae6"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision \u0022removed deprecated \u0060FromPyObject\u0060 blanket implementation\u0022 is present: Add a Context section explaining why FromPyObject was deprecated (e.g. it now delegates to the correct overload) and a Consequences section noting any breaking changes or new usage requirements"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6188.removed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fbc587b15f79a15bc89aedee42e7e2fe6b600bb648a0feacabf3f27855e0c79"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why deprecate from_build_env in favor of an explicit constructor) and no consequences/trade-offs: Add the problem motivating the change (environment-based abi selection is fragile/cannot express version intent) and document the trade-offs: new callers must use the explicit constructor, ABI compatibility for existing builds"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6192.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c1cb161a358114fd9c9af02f81ab292a9f006e8bcf08144e87ac26ab2a42080"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision \u0022Added FFI bindings for CPython eval-frame get/set API\u0022 is present: Explain why FFI access to eval_frame get/set matters (e.g. interoperability with Rust/other languages) and document any trade-offs such as runtime cost or ABI compatibility"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6195.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"07138dcb731e3028284b6364be9f5996accfdab2734f9251ed54fedeb4a164b3"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line decision with no rationale: Add why this binding is needed (link to private CPython symbol on \u003C3.12) and the trade-offs of linking against unstable Python versions"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6195.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8538f290320f0ec45afeaafad51954ae68e709ef111522d131d9a75f9b5ddc3"}},{"ruleId":"D20","level":"warning","message":{"text":"No Context: the problem is real but there is no explanation of why attaching without decrefs should skip the deferred-decref pool\u0027s mutex: Add a Context section describing the concurrent-attach model and when attach would serialize on a global mutex (e.g. during a free-threaded scan)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6200.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbcba8a574ced73b6e520dbb289bd9d213f7ecad128f06d6a4f862762b162dc6"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why extract set/frozenset to Rust) and no consequences/trade-offs: Add a Context section explaining why Python set/frozenset extraction is costly in Rust (e.g. repeated allocations), then an explicit Decision stating preallocated destination sets are used, and a Consequences section covering trade-offs like allocation cost of the initial set plus the per-element copy."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6225.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"41539d902446e3f5cfe6bd208f451e6696b030bbe35b2f1978f6b27db8b51760"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem motivation and no consequences/trade-offs; only the API surface is described: Add a Context section explaining why GIL-enabled CPython watchers are needed (e.g. avoiding cross-GIL race conditions) and a Consequences section on trade-offs such as thread-safety of the added APIs"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6227.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10074b55dc5cbaac29e95815f80eed3bd69f109e2b67c0f3259b15eeff057b79"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the method signature is stated: Add why a concrete \u0026mut dyn Write receiver is needed (e.g. to avoid requiring an extra Box\u003Cdyn Write\u003E in the call site) and the trade-offs of using a non-owning writer"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6251.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"caf0f9cf9cdcbcf8b0a13c06ac18950404c505e79e7ba0d56eab76b57f664ff2"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences; only the decision \u0022Add tss api to ffi crate\u0022 is present: State why TSS API integration with the FFI crate matters (e.g. secure shared memory, cross-language ABI compatibility) and document trade-offs such as build-time overhead or dependency complexity"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6262.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f88a929d7a54735df134c0c042668a93f0132c85bd668a583099133de68b8f16"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why the change was needed) and no consequences/trade-offs: Add a Context section explaining why initialisers cannot fail (e.g. side-effect-only code that must run once) and a Consequences section noting the silent-discarding behaviour is non-obvious to callers"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6271.added.1.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"380cc69f14596aebbcdf1150b43ded11916e561683f12193aabc0c5a354b6f66"}},{"ruleId":"D20","level":"warning","message":{"text":"The title is informative but there is no context/problem statement and no consequences/trade-offs for this experimental inspection change: Add a Context section explaining why repeated members in a type union are duplicated (e.g. generated code readability) and a Consequences section noting the trade-off of adding whitespace on both sides"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6273.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ceaaede24475992f5de303e501d5b1cb80066ad22966a30626a1eb6e5c8e334"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line decision statement with no rationale or impact: Add why introspection over Option\u003CT\u003E as T is needed (e.g. avoid yielding None to an iterator) and the trade-offs of breaking existing inspect code"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6274.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f606467bda78c9282abc79f5f49842736b3016eef0f51c38314df2fb16043e87"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why these GC functions need to be exported) and no consequences/trade-offs: Add a Context section explaining why FFI access to PyObject_GC_Track/UnTrack matters for PyPy interoperability, and a Consequences section noting the cost of adding two new C API symbols"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6299.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52cba6c41a7d364951a73019df9134adc31380bb5a51d20157236fa791c39f72"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; the title names a lint but the body is an empty decision with only the lint name: State why clone_on_copy is triggered (copy-on-copy semantics) and the problem it flags (unnecessary clippy warnings), plus the trade-offs of disabling the lint (e.g. false positives on intentional copy behavior)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6309.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf1ffa96247e5bcbca7161669043587ce62b63d4f20853aa7605bd355a39c834"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why move the types) and no consequences/trade-offs: Add a Context section explaining why pyo3::types::PyMutex was moved out of sync to clarify migration needs, and a Consequences section noting that users must update their code to use the new module path"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6324.changed.1.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86b6c7a3532496e10456589b4a9eb1cf29f5164a91bcffc73dfaa4560d46de2"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision is stated: Add a Context section explaining why helper types for Python types are needed (e.g. ergonomic API) and a Consequences section noting trade-offs such as increased module size or breaking existing code that relied on deprecated aliases"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6324.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d54b6942bc8768d676136d5ddeb41763b8dc098c1068c451191ab8e0d032c58"}},{"ruleId":"D20","level":"warning","message":{"text":"The body is a bare list of function/method additions with no context/problem and no consequences/trade-offs: Add the problem motivating each new API (e.g. MBCS decoding vs code pages) and the trade-offs of adding these functions to the Unicode module"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6349.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4433b502050320ea695d368f17908821c1442877b664cb86417e3b12924302a8"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences; only a bare list of added functions with no rationale: Explain why these float-packing/unpacking functions are needed (e.g. interoperability with C or third-party libraries) and document the trade-offs such as API surface growth"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6350.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d358053bfa6aa3667736f3c95c3ddb6aff4dab45797a587f9db0016be2954485"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; the title is generic: State why accessors are needed (e.g. to extract signature, inspect parameters) and list trade-offs such as API surface growth"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6351.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92cf6a5a0655c15454fa33484f65935bbdfb1bb1a97e951f491b0ebdc94ec654"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line rationale is present: Add why re-exporting stub-generated submodules matters (e.g. type-checkers see them as attributes of the parent) and document the trade-offs: generated code may appear opaque to callers, and re-exports can break existing lookup tables"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6360.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b1dbd1d970f840454ab1ced28fe414b8fa46013019a69d70342b77478b478a"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why the disjoint_base decoration) and no consequences/trade-offs: Add a Context section explaining why extending a base\u0027s instance layout is problematic for code reuse and a Consequences section on trade-offs such as requiring typing_extensions for Python \u003C3.15"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6362.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dd864ef2745a06c4783676caa69445e3db1d27324785d4b881958b5b53c7ace"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why inspect trailing args instead of omitting them) and no consequences/trade-offs: Add a Context section explaining the problem (e.g. callers expect trailing defaults to be omitted but introspectible) and a Consequences section noting trade-offs like slower lookup for unbound arguments"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6363.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ecd9340ec8ee0cf9706a6c857f608a9dcf78700376ae182a15b254c5cd558a1"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision is stated: Add why this nested-directory naming convention matters (e.g. readability, tooling) and the consequences of changing it (reworking existing stubs, breaking tests that reference the parent directory)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6365.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"69ad3902e3d3a73f1f27e7270d937efd24cfb1f299720bb844377b3929d450f7"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a decision \u0022Optimize PyBytes::as_bytes() in the unlimited API\u0022 is present: Add why as_bytes() matters (e.g. high-throughput streaming) and its trade-offs (relocation cost of new bytes, copy vs slice semantics)}"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6377.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5c47a30a32d8e4a5d5969ef719f4595cb326ebeef0d7469cc936e6dc49f5aec"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the method names are stated: Explain why slice-pointer semantics matter for Fortran interoperability (e.g. passing a contiguous array to a C/Fortran function) and note any memory/ownership trade-offs"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6382.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c223e41bb4c351db7061fd7ed73d3ee63152dbfde1e4c9efadb3b43e0f647e03"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why the rendering changed) and no consequences/trade-offs; only a bug/feature description with no rationale: Add the problem statement: explain why empty tuple type hints are rendered as invalid \u0060tuple[]\u0060 instead of the intended \u0060tuple[()]\u0060, and document the trade-offs such as how it affects existing code"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6393.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4174aca30693a0bb31a2af9d168f947570fca6112ab93f88e4c713b9725eeb69"}},{"ruleId":"D20","level":"warning","message":{"text":"Title is informative but the body states only the decision (escape stub docstrings) with no context/problem and no consequences/trade-offs: Add why escape stub docstrings matters (e.g. prevent syntax errors during import or type-checking) and note any trade-offs such as false positives"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6394.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2a1e0ac35962dc61362aaf8e520d2d628c3bf17a5f853ba6f10c3fc29dc844b"}},{"ruleId":"D20","level":"warning","message":{"text":"The title is informative but the body gives no context (why PyBuffer annotation failed) and no consequences/trade-offs: Add a Context section explaining why Python \u003C3.12 requires typing_extensions.Buffer instead of collections.abc.Buffer, and a Consequences section noting that this change breaks backwards compatibility with existing inspect code"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6395.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ffb235dcd6569111f529e3edc68395f5858ec7a9413823c13e6669d119e277e"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why the annotation is needed) and no consequences/trade-offs: Add a Context section explaining why SupportsIndex/SupportsFloat annotations matter for NumPy scalars and a Consequences section noting that it adds runtime annotation parsing overhead"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6396.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"253e6d087d324f9edcbd64f30f66cc91008600358271991df5be985291766b6a"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a vague title \u0022Fix string constants containing control characters rendering as invalid Python in \u0060Display for PyStaticExpr\u0060\u0022 with no rationale: Add the problem (e.g. strings like \u0027print("},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6397.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e93c7590b7defdc89382302a8d11411de432d5983d3a033b7fa06ae577a483b"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the bug title: State what interpreter/execution path triggered this crash (e.g. a detached thread is terminated during reattach) and document the failure mode plus its real-world impact, then list the consequences such as re-attaching behavior or stack-trace loss"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6404.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbbf3dd6bfbb9b2368674973e271f3c3ed536145ff6d461cf2bed6becbb31e67"}},{"ruleId":"D20","level":"warning","message":{"text":"Only a decision is stated; no context/problem and no consequences/trade-offs: Add the problem (e.g. GraalVM/Python interoperability gap) and document trade-offs such as build/tooling complexity or dependency requirements"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6406.packaging.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5e3af922f9f9178f42d5e6bd86abe48a24c1e83455974b6d19be61bb9f8862"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (which Python versions the bug affects) and no consequences/trade-offs; only a one-line decision with no rationale: Add the affected Python version range (3.11 and older), describe what the FFI definition PyVectorcall_Call does and why it fails to link, and document the consequence (e.g., incompatible codebase)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6410.fixed.2.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e5b33a45909b9df3197b634153c291548b3921280e2aa3ff432c57680996cc3"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line title stating the fix: Add the problem (DLL load failures on Windows with PyPy when raw-dylib linking is disabled) and its root cause, then document the trade-offs of disabling raw-dylib linking"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6410.fixed.3.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b7c39f8a2e579445ef45b398f04b8393695325198defc55fa02be4b905d62a2"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line title with the fix: State why raw-dylib linking is disabled (e.g. compatibility with older tools) and describe the failure mode it prevents, plus any trade-offs such as increased binary size or dependency on native libraries"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6410.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e649d40e85ce67c53916d296c56c19cd16a70e456ff08842885038530bd26019"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision \u0022Implement \u0060Copy\u0060 for \u0060PyVisit\u0022 is stated: Add a Context section explaining why Copy is needed (e.g. interoperability with Rust) and a Consequences section on trade-offs like runtime cost of Copy"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6412.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa867ad6eddeed70e36fef89d68168cdebb1139cf59ef7588d4d30831c3797ba"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why annotate these types with SupportsGetItem/Series instead of abc.Sequence) and no consequences/trade-offs: Add a Context section explaining the motivation (e.g. NumPy arrays require SupportsGetItem/Series, current annotations are too weak) and a Consequences section noting false-positive risks and why _typeshed is preferred"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6413.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f5898752be039c1437eabc4f6e627fbfe5ac248d65b214099990f31295ae8bc"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why these GC timing hooks are needed) and no consequences/trade-offs: Add a Context section explaining the problem (e.g., that PyModule_GetState is not visible during GC) and a Consequences section on trade-offs such as ABI compatibility with older versions"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6419.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e591f4229459d9a36a0ac748badf6b67f4e4596020daf6abf0b3a90fd6bb78"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only a one-line decision with no framing: Add the problem (e.g. \u0060#[classmethod]\u0060 dunder methods are dropped before the full function call completes) and document the trade-offs of keeping them alive (stack allocation cost, GC pressure)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6420.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb8f0b81bc789eef009e2802c2819949776bcf83ef8acc93012aeaf56ed3d751"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision is stated: Add a Context section explaining why FFI exceptions like Py_RecursionErrorInst are removed (e.g. they are not present in supported versions) and a Consequences section noting any breakage to customers who rely on those symbols"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6421.removed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34972aff5f1e04a35097e5345621688040d02c666ee1f56dd0ccb153b817f0e"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision \u0022Fix linker errors on PyPy for outdated FFI definitions where PyPy moved from a function to a macro.\u0022 is present: Add why this change matters (e.g. existing code relies on the old function signature) and what breaks if reverted, plus any trade-offs such as increased build/compile overhead"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6422.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"476558d53516df49f701d3fa0d2d621f93d83e186c0f8b4c72a264f5c6b9c8f4"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why the aliasing bug matters) and no consequences/trade-offs: Add a Context section explaining why aliasing a built-in class like \u0060Array\u0060 to an experimental stub is dangerous, then a Consequences section on how it breaks existing code and what alternatives exist"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6424.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d815b9f8df3b4f217cd703cbdf2a48e7bd458216aa380f0d0c8e3b63e8c6768"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem (why pyfunction was marked METH_STATIC) and no consequences/trade-offs: Add the problem statement: why \u0060#[pyfunction]\u0060 is marked METH_STATIC in PyO3 0.28, what it causes (__self__ None/calls slower), and the trade-offs of marking it METH_STATIC (e.g., breaking existing code that relies on __self__). Then document any alternatives or workarounds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6428.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aee8754f82c303dce9ae3b978195651ea3a5be3e76531dafccc8f5b04462b9d"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the decision \u0022Add pypy3.12 dll to list of ffi sources\u0022 is present: Explain why this change matters (e.g., compatibility with new Python versions) and document any trade-offs such as increased build/dependency overhead"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6429.added.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e04c60278da14e3671f27ad05671a374006d9f9893cb5e7728c63fd139d51802"}},{"ruleId":"D20","level":"warning","message":{"text":"No context/problem and no consequences/trade-offs; only the task is stated: Add a Context section explaining when Zoned extraction fails (nonexistent datetimes) and why it matters, then a Consequences section covering trade-offs such as invalid-epoch-handling behavior or rework to fix"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6450.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f2de142a7bc3011deb0b6cc7dc5d50ff37c5450d0995f047ca9c763a1522e2a"}},{"ruleId":"D20","level":"warning","message":{"text":"Title is informative but the body states only that Access traits are made available for datetime and gives no context/problem or consequences/trade-offs: Add a Context section explaining why datetime Access traits were previously inaccessible (e.g. ABI3 compatibility) and a Consequences section on trade-offs such as breaking existing code that relied on trait names"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6452.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94f1bf4b3e8bcce140536470f166dc5cc712905ef9c8849bc6d3c3a5c5ac1ef6"}},{"ruleId":"D20","level":"warning","message":{"text":"Only the decision (MSRV bump) and no context/problem or consequences are stated: Add a Context section explaining why MSRV was bumped (e.g., compatibility with new dependencies, breaking changes), and a Consequences section covering migration effort, runtime cost, and any new tooling needed"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6459.packaging.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a453bf05507e9ee237e147b343ddc8392173ce6c328bdd780d2c33eace9ed5c"}},{"ruleId":"D22","level":"warning","message":{"text":"Naming inconsistency for context attachment methods. \u0027context\u0027 implies a static string or simple value, while \u0027with_context\u0027 implies a lazy evaluation (closure). In many Rust error handling libraries (like this one appears to be, given the \u0060Error\u0060/\u0060ErrorReport\u0060 types), these are often unified under a single name (e.g., \u0060with_context\u0060 or \u0060context\u0060) with overloads or distinct parameter types, or clearly distinguished by prefix (e.g., \u0060context_static\u0060 vs \u0060context_lazy\u0060). Here, the verb \u0027with\u0027 is inconsistently applied.: Rename \u0060Context.context\u0060 to \u0060Context.with_context\u0060 (if it accepts a string) or rename \u0060Context.with_context\u0060 to \u0060Context.context_lazy\u0060 to make the distinction between eager and lazy evaluation explicit in the name, or unify them if the API design allows a single \u0060with_context\u0060 that accepts both via trait bounds. (signatures: Context.context(message: impl Into\u003CString\u003E): Result | Context.with_context(message: impl FnOnce() -\u003E String): Result)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f9daa864bb562054af2e04b2ffd172c59a8f5690f5e4fb9ebaefac12a66dd173"}},{"ruleId":"D25","level":"error","message":{"text":"ADR not followed: 6195.fixed: The decision requires a public type that is not present in the summary, so it contradicts the binding-to-private-CPython-on-old-versions contract. (newsfragments/6195.fixed.md)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6195.fixed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cfd4d748bd00c7bdf5eca0affc3eb7cd6d244a62b122607fe1be9fde1a12bbd"}},{"ruleId":"D25","level":"error","message":{"text":"ADR not followed: 6251.changed: The public type PyBytes::new_with_writer signature is unchanged from the ADR, so it does not contradict the decision. (newsfragments/6251.changed.md)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"newsfragments/6251.changed.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a0a351bb1b9fb67807cb52e90072ab18fa80692df9394058b18d29e4641a2d1"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 2 of 10 project(s) overshoot their size bounds, lowering Project Cohesion to 6.0/10. The most over is \u0060(repository root)\u0060 (58023 LoC, 388 public types across 16 directories). Review these for cohesion \u2014 draw the boundary inside the module first (group each responsibility into its own package or directory and keep the cross-boundary members non-public), since splitting a published package moves types between packages and breaks consumers."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d5a94650dc74886a0f1f08eb9fb6775f1fc395279ef7e901c970c9d26f767a72"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3dce655c784eb036f2e3af4590783f0e78c82616debca2e5f0e8ca5407a4261c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4bb759f0bbdc02c348ba881a79aa5e1614fec713f81bcd54afbba5a8bd1f515d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fef1b67b6e395f6497e515732ad98610034bc3eb6f17986ff3195a2ec3c1403e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9f94880e68684c8ec182cf97c7bec504a31f9d9dc1741eb4935914a407a3a3e3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ed742971e4877e341eb5a58870d2809fab8931737bf89835d7dd3ffedd0e98ab"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b09132cbee09eec1df856bc0f999b5149c99acbac6ea402023c47ebc9ca638c9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"336f09ce19f4a15c0c01de09fbb0c95eed069d8dc5625749289af10db4d56b72"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"21d942f00455668387bf778227eb559a60be168da88f55a5d5d05fa221061ec9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8bf9e2f0181c5967e23fcfd69891f0651ce329c8a372231f14135099c1d297e6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"063a2400772be22539a1c1f981147ea2496ef6e0d1587d57e2db10663699318c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3fa409fd06a436800b3eaf3d61b1b74be1108cf1b97511db6d24fcd295a16d43"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ff7e5c904e5d96cd1e001b5e46a15b250343dd37b952a2f8ae7140766c4e36a9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9066b6aec3bfbadd42d27ea482fcf4b6007e7dbc5c77ebcbad9fad55bfd0276a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c448df03ea83b5a9a05135e643acdc70b20d9e66945e1861bdc4b1c300325bc1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6819e8830ebd605b87c7c5c57a72fe279cc14a0b50e89317f62241601cfc8618"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d5b8f11381d61a58459ffc7c595fd52d09c03c711894a63a9578043d2338412b"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"847257851b4f73747a71869e26132df22a23b931e8667236207d9ee8e3cd3301"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"576af598a5a758a1d18cdd7f16560b22de38043938243c84fd1fef1686afcb82"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"27348afd6a3dcad3312da3756ca4418436c8e20971f533d1739d56ecf0e859e0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2f7429eb187c71e09de8c08bd95a766833c5e431b928e6e24430da4694698407"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"424215e2161f6a6cb0cb886ea2943f71913fa5e326a0239096f6d8bc029c8da2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c65fbde56ceb5a939da7ab43efff54c5b34340035bd2238b63bca9e06d30cfd9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f5d7dd4fbe167f3935a71e240127a55975e66d739701948cdf7c04bc67689de7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6820f940ec024d63e88e401931282edaaf8754eb0429aba584ef1f0609479d4f"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9d1fe100590fab23402b0db5ecdc7e1a0358b1d62ff7d7b4099cd57a4b9f58de"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"090fb9073f5fdb2293b171ef4b915ee479b569f28c51d74d7b541818cea372a9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b76fe65b951834af47f41e27b21e627a8b2ea5cbeec32a636882d083fab8ad61"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8a0fbe3255e4501d16406573403272a4cdc371829dafa7bc1c5fe99f34fc905c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1f4038f9c29318e4cabfcfe5282a24e2b2a58c8cdd0709749bf69fc3092cd1a8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"60122fb1586df1b05b60a0103b88420e9dfbc620eff2fa09edd7a4f27dcc77ab"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"da12ef413bc935a58f13c34892f36ab0a381e82f2d9ddd619597020b52f8817c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cb3172fe7eb67a7cff0a090bc56c72484d37f5bb959464152930f94d78d47bdd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ffead2b13794c15ec8ce65a53aebf15603987569c3b80f35f77dbd06370388d0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"01f230e708115a2f2459fea8baad006f9d9b1aee70c0dd0f9c225507f0c518f7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85f27e30d1949d338163b5ef314e5e75de49c5807a8a6c36ea0f9fdf344b3a20"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9036bbe95dfff1d3559d4c82b425973d0a2ed5d5821c29e2ad99cdb442c217f1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"44d590e6088e0ef09c02bc90cd3302ce65c9413cc90dcfd3700029ee11ea1829"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dc958ce481cea3d93eda2753d71c25de99f36b3862695c26a64d462628429930"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4f3d9d2ab2872a038566e9f205757e3b76fd879f63aa52b8217be720be6ce8e6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5e6895367a2f7c9480af8204f9c067333e31ae6c83589f39f8120eb3ee5f854b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3bbbe6914e8dd07ad7a34f035d8ca654cb8e977e3c5e60dcc282c659ef3ae340"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1e7f18fc0c3fd265fc9760bcafa912e8d610b10978c5898982a09e97ef5fdda4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"71d409363b55a1d24dc05307b924cc6c6729c6dbea72afa05fed85828fe13b0b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d43257ac0118c9cf103e1c0608204c6b81d98f4fcfc1a8a49fa756e4bfbfc0c4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"866f5db9e17cba13054be81498300d5689d6380b38ab693dd948f99e20adbff5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"670c36723bb7f07ac0135f1313c2476b99ed1ec409b0edb8a1673e4fdd9964ab"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"493308c88e8c66fcb98ce33fa8a7c07e2fee06375429dcf7629ec741ee5f79d7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"092fbccc5a1e6ddacc4a224cda7da55e82b02dad0f31a5602e4956fb9f6172e3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a550cf5e27a8b506045e8d79bea30953c1a97b6937e60e5e7073c41d1cf1cd6e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b9b817e6b91dda87dda01a574bcc59067ae95fd114a3690942e3f2a66303c65c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d839d64949cdd3d48927535694ee9c1e7d1f59e3f84cd031177b1b1833a157d3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"91a9a07de525ab8ad2fcc8a0d030e63b249791ca7a01a8c961bcb33d20857531"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"86cc361b36735e4f8d9b9924f9bfcd4f8ebd2ce257f31fd78c4b71420d976aeb"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"54015389eb5f9a0beb6433e209224f32665bbffd45f48b4ac71eacdc7584cddd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bcf13dd59f01c3c8613172682e8a863384e13bf20824242f1974f47e650e6547"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"020cafb4b432c063d2e6e187215f5a09d628dca9126beef1dc1975a4702a2e3f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"544c4a2303e57e60958ebdb6fd0080ef710d74b76fe4c14761c1aedd5f552ab7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f6a8f41c52ec6241b0b2d286f2361b6c73912317b69d651916de05cae7c1885a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6f589ac419530b02820c0b1163eb6fedd9fa4f3c54d89d0a3815ef52f8b8bcb0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7292b75f28bcc1b9f07a3e99ab581be9081f033913f06c5f356aba1e2b565c1e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c2da0fb11b282754e1caa8a4fc13f4c0a66ddc6f838e13e6793bdff1a8617862"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b51a2f7dde20710a2b7e23d6f43643473bcc1d97e07f09b483d71b0f06980159"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"91ab08c4ba48802f7e21d19d0fbffda2e90f7c1c0eec4ee8be049e7838f52072"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"52bc83b62dafa488e32298b21c7c68be0617d02561c649b8c3f3ec0a01ec64dd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d9525315a3cb1310a0b67d8bed75b5c222bfee55a252476ffae05acacc3d32ca"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"58416306c1a27a37c4768b939e55dd2865e8672774adab59964be2ffeffdd74f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"05dd1cc6a6536213feac72458953b3ecc92da85b7219289a9d2c68054660f8e9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"790e959a62c60648ed49cc6702aba681d3ab30209634c0d8c0ce23ad896fca38"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d7364153716539ac2e6a80f7945067b52021b6cc748e68f353a30e2ef3ac25a3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e46fcbff79ba10f86d2a2fdcc8786db7adb8c23c1830c1ac9588d5ecb034b9c0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1f142d753580b7d995fa14e5d1240d435d6fbfa526d51f115eefb94af44e5f8a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"99c8716916ca0dd9ddee8302208a5745bab6513f34ca12c2672d93f07c07be5f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9288cb9601314ea9a5685f9e586cf1ba51ab0bb8838969a5bcd635c80eff2bf4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"55ac77a39e5983fb345d05de593953fd8572e9daf6db337e95d0eab5eb7ad29f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"40235cbe6c9e12d736505f0789a0caaa7efa5944d9b2d217de0bc8cb95537024"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7bf363eaffb2192153b47320a0ae78c192b13a31ccb3d0e537acf7e99537e806"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"91a22dca4724f3d5bedb2d491fe84ba2703436475673c12f1c3c13228f17fd8b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0b81debfdf26ad72c8d0b6ae327091ed6b094389fdb86a94cad6363ea8f38e48"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9b61680871f540084ab96f6c4b2cc94e6ba50ad68cf1176fdafce94f15dbc942"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"28088ade1067600dfe95190035b2f83dc09b66884ef4a3e9e3bd7ac2f4bbc148"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7d820932e4416d4862fd5ffdef6b4665d5f995e725b862e421e01ad003ec71ba"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a87fe37abd98ed5a33f600b4f7f4dde8d7b6b50847cd3b14bdf28e7e276c1ace"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4c225dcdb2b95cba45633ec106c65348db0f4e8d2d62d70816c721977d2cd932"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6beb1dbf722dfdeac8e49068fd6c16b05da43c9488627b3c5c02adaf3651ab03"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"233c283afabc3cbe9e1fb2c663cda67ee401e34fde1c1baa92c564e85ddd0b79"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b4db698265361e4ca0245164e4445edb93fa431ec3b8ad4d73e672262054654e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7f052e3b915703ce74dbe254ce3507080529b36b18c985045e6219d12e5a0d05"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a1873f73df2980e05749fb989e4983bd7e44b6790994284629fa7f4a2ef29ad4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4599a11b73d9e7a99b6dcd37d0bd289587318a5b641c93481867a9c8edd68b0d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fc8421e63650e7ee3663b978d43b71ead4d5fa8aeb98c9dd96612887864100e4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e8358801f39b00898552496f70ea14d5cd30197b985656c6109c836b3d66a18b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"45e43b2cf0f13df69fd5c5d1f3263d8d91ae8a1d217ff414c529a77aebd1ca8d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8da6156ca2ac326bd3499faa2cf82f5798441b532806eebeab439bf9f35b13ea"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"661a4e77f07de24db9ab050862731045cb7a8d0b95aac82cde5ffb97e524cf6b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"025d966d92db874c853bcdc185c834476e2b7f70f0b14505cf447f7f1e52d116"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"57d823555c0f50a3493fd14230fc2974c80d783a2164e0399518f807a574cc38"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"df38043f089cc380f0507d28c25a6e9fb75594e3ba57309dfa9892cd52cb6a01"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c64eb61628223e96c5097cf4b37419d146556f727e69fb7a4a9e5bdf84c67d9f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"258f883cab639eb77ac5df1bcf537aeb03786cdafb44580c88f75d49b457b597"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"35556a5475cb1c5234059a0b3c30dda978f5fd4eceae301f3db788741b04bfcc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3f1f6b90732b5eea89d75c8eb56c22b34b013eedba4193d1346effc97ca5f250"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"07d48275db3fb2892bd4f761735d47b6ab3fcc7871415dfc21ca2f86bb46b2bf"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a4afd941637220eb2d9b700ab7678ed6bc2866fc78e55f00d750e7f67bbb35bc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4abe525542fb8a5f1b379bb4012fc65ddd5e5dbc57227b8fbbf44cc58d2c9e38"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"806bf49c97fdbf70a27007ccb856230a28f0af3c443a9a2c2629095f358cc8f9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"82cbe1313a11196f877c6a5a3012f4fc17b3169aa7ec559cdedb5e4c8af7c899"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"63246ddeb028e90fb5f21fd27d452f3891b3a9b8400b5c0de59e9dcf2079c0f5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ba42925fcfece750d316c1c02ce05989766ada17e58e7c5acfe9de02fe9558df"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5e3d5a14497a80a634e3f229cdc05601fa22bf534221356abca84b845152a8a4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"78a0fea71b36253b1c12b2a9bd56a94c310df31cdbadd61babdf2086bcb78589"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"89c8da58d998a03c4a7ee1078d774ae51e2cbb0d79eb7ccf8d05e484b6e35962"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"74e9a15e0aaad67b56b01fc904a989f50780d47c2a8d26f4479f4d170548bf18"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c7838abd0c933c3440606254d0ca070d0d26281df17ed74c1cf523eb787f7ef6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"61f2828043cba3127d349c942d37191a4f0ff2a157c70d1832ffd23d6abd6e89"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"93c67239263ced008f6948a23fc91225b82d9ea981b2c200b7bb9b3e6d6a2731"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"52ff0b42a57f15efb4b7b6e4a89e8be46f57637342b8439e9a917eaae8e68a73"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7a647702da2272407eada0370bd5638399ddbb6bafbd73ce472bd4534a10c0b1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3510ebf6015b20a552ee08c3d9458ed4c9acbd62e27e91e75a7c8a6e48df3572"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f1f8890c4fa49af0592e054e569d3f89b6052f40c1cef950989e13e74b73eeb9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d92d492f279497a97159e521f6a848a5f0fc66e0e4668028d0cca48bba8e0cd2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"58256893d27184e87a9716cf2e832251eab8b4976341d25ce8d32ea5ee16a1ed"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"08b71fb10678fc9ef0609e2ff955320b601f3b60085370c51ba8fb4942597105"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"14b5e6ff59afe98a15e11a728a1331a7f20770be0ce417680cdbf574e31a532b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f782c0d7a9f0d5d38c75648713b76f1fde3fc1f981d05642591632401bdb112c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7af6ef4b554803f458485b9c65a1f0cc0c555b416896814068bb51389f802f62"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eec23001c85f5166114568a6b0b0880c869f87e22baf6a815260454bb1bf5497"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"62dc7eb8dca3d7ac754bb065cf66383079097e9babe0d724e610d731d06b3c8e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa46c2b22bf7340b91afeef2b6626d5f3cf0b73dad1f6df6ddf98603005c74da"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8f1ed0dd33a97b03ee8212851ff4edefa99638989170a4b547fe4919f981b93d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"31ef1303dc2effab9da23e73d8f85dd56fe4764f78a964a3d40ddb1c5084873c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"26df466962a9b90164f35a54eaf7a5132f6b82e2f2f5e026ff1f94ad29c16ccc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9065d7fe968e51606543e9c72017ead3e2dea75e231aef2a764f02996b626c25"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"71655b8e56b3eb9f6ac6424a40d34b6e4fea792bc07353d7d4686247e792117e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f5bdeac38f4a54ca2fdc96bc756481a349a58dd299c85b09691707602dc21818"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"720166f5d9ab8d1f5318ce602de3322aa36368cb4a073889fb925504996e06bb"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"33e8ab5160bc042ef821a3b2850627ab1e24e2edef8f83757d7800a9d020a6fd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f653fc6f6e54268de28e3fa57587a62aa0049a5dd5d14e4e15af640bc142fc13"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c3eb8ab47ea18a29b039774ea93e0dfa032a74fa5b0c54f613df3526d5fdec30"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"48e720b31860051fecab5678b6e7ed025073ce66e4e74a2f32e280bc068fd5a1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e6699baea9dba404f9a6017a4d2094407a0fb5f987366776000dfbc7cd909cbd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9bacc66a7c7154bec4e2aec31352c69d2cdf6c4cd1ce1fa8d87ce8baf01b6332"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"89a6e8e677b923f712f1ca80df4504fdece262c0f381cbb7ff49e701fd1f9a88"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"37c3a93ab41864672c7b7df305299904a30d095a1541c4ed9fcb5309a914d86e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8c74ef804aa89ab2ce228743b7716a8bd83b888a0b85777c288a43c05f5767cd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a8f788deb4ebbb6041b09d9bfd7b8721ee51b85ac2eb47de7b8ec9c997e37411"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c30df57168f7362481d17db1ee5af585070f0171bee35de1fc160891b0f4b476"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"324daf944b7a154bc81e8eb1fe3e856359799abd16e93b1c6bb54d783d0794a8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2f46d8197ea5a4d647b7e535189d4808b8137d7286c41ed3cc40f4c5329604f6"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e976ebffa6502aa9b5c4435d5f4e16910c0dd8193fd65be9caa4acd20f25cb0b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"89d6d66fd762c8aaaaf317a510e909535a449b7ffa125098b0be6e580d220b00"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fa1300216b7b1efa770bc9159afbc69b1ca2274bf69de2a21beb99f5da2d5f7b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7dae21849b79837da66f2401a7c82d579b7f6f31887f03f442e5624c79bb76f8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e433f7d71bbcc2f65b1770564e3611b4abd33cd415ac11149b126851237c0a1b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"be6856f9ccbd4ab3ce6c98b09b08f67d7d7eb92145cc03ee389b0ecd92391318"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"73a9ed7d31dab533664f36fd2e656f3f8a89e952e5c7d9da50a406b8f9cd6a2e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"537cd8b4aa1d5673db802c87c1fca373d92883249c344fdcb24b59b8d559a1e4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"167ff663211d9a6aa7dbb4973c7460ada0843e317b28f346c5cb5d89e5368b7c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a16d969221eb6f1705059136f6f09dd0985f77eb67ec4b3c143d9c0bb7bbcacd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3d43985c708b2c962bc7790e0ed5fd27190c3d8a452391d0b4e2d45cfe4329f0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"803902f685d866a9cfbada99c77d1c71acc0032d0fe56e0ee2cc52ed5737c484"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b7c925d91143993fc482dc448ad81b9275b2a77914b5e1e75ea4574294f2aec4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"25a0831791d687b38f2441e9534f047a16e4885db6e45af686b2b3b6e1f9b7a9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6ed059458dc0d864f79fffc2c8cd3f09ac2213f256b255ba1e07734350228541"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"37c03d305dfd72963c6a91d64f5ec6ec137aeb7fe7a16c638e17faa738a95da7"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8fae119e127aaacdd9e400c738353fb17b25e55ca9cc8f91fbcb75abbf17849d"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9505e5018868c47e95c333290d9b3b84e451863fce4d1109e81715197b89caa2"},"properties":{"dependency":{"package":"sharp","version":"0.34.5","advisory":"[GHSA redacted]","aliases":["[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"22c83ba4fc8bb777b63c87c99a755cd50469c75c7e9be2ed03a96e769d562df6"},"properties":{"dependency":{"package":"click","version":"8.2.1","advisory":"PYSEC-2026-2132","aliases":["[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned files with no living knowledge: 1 of 208 analysed file(s) have no living knowledge left \u2014 their last meaningful change has decayed away, so if one breaks, no one currently understands it (counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 208 of the 319 production source files in this repository met that bar). None is large enough to earn a read-through of its own, so this row stands in for the per-file rows rather than raising one each \u2014 most significant first: src/types/genericalias.rs. Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: method.rs \u2194 coroutine.rs: \u0060pyo3-macros-backend/src/method.rs\u0060 (context pyo3-macros-backend) and \u0060src/impl_/coroutine.rs\u0060 (context impl_) sit in DIFFERENT parts of the tree yet change together 82% of the time (9 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u0060016f795f\u0060 Simplify method receivers in macros (#5684); \u0060a7081e72\u0060 fix \u0060async\u0060 functions return \u0060()\u0060, not \u0060None\u0060 (#5685); \u00602e56f659\u0060 split \u0060PyCell\u0060 and \u0060PyClassObject\u0060 concepts (#3917) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-macros-backend/src/method.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f6c163cc2340cb48458eb2c461ff0015ba0020b0020071c17b186b86e496e8f"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: stubs.rs \u2194 introspection.rs: \u0060pyo3-introspection/src/stubs.rs\u0060 (context pyo3-introspection) and \u0060pyo3-macros-backend/src/introspection.rs\u0060 (context pyo3-macros-backend) sit in DIFFERENT parts of the tree yet change together 56% of the time (14 of the 25 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 14 shared commits counted here, the most recent 3 are \u0060e8701ab6\u0060 Introspection: generate nested classes for complex enums (#5708); \u0060185e6b34\u0060 Stub generation \u0026 introspection: emit async keyword for async functio\u2026; \u00602584edbe\u0060 Introspection: pyclass(extends) support (#5331) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/stubs.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ef6e66d6a68ffb127c2dc3ff42b0830551466b3598ed98b2e4ce1f10a334892"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: lib.rs \u2194 macros.rs: \u0060pyo3-ffi-check/macro/src/lib.rs\u0060 (context pyo3-ffi-check) and \u0060pyo3-ffi/src/impl_/macros.rs\u0060 (context pyo3-ffi) sit in DIFFERENT parts of the tree yet change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00603260c483\u0060 bump GraalPy versions tested in CI, test graalpy on windows (#6406); \u0060276ffd25\u0060 fix raw-dylib opt-out on windows x86 (#6410); \u0060d566a2db\u0060 more cleanup of private FFI definitions (#6042) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi-check/macro/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e8b7f78414dcfb8a01475a4814c22853fc2df738b489dbd630152709da69e45"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: anyhow.rs \u2194 eyre.rs: \u0060src/conversions/anyhow.rs\u0060 and \u0060src/conversions/eyre.rs\u0060 change together 90% of the time (9 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u00606a930e9d\u0060 internal: No std broken on main (#6383); \u006018bca6ec\u0060 reintroduce \u0060PyErr\u0060 constructors and methods (#4475); \u00606caefd15\u0060 Add back \u0060PyBytes::new\u0060 (#4387) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/conversions/anyhow.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bc1242078efd4ae1574b16e0943b596cdace3079088f840776a3805192d2e35"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling clique: ellipsis.rs, none.rs, notimplemented.rs: 3 files \u2014 \u0060src/types/ellipsis.rs\u0060, \u0060src/types/none.rs\u0060, \u0060src/types/notimplemented.rs\u0060 \u2014 all change together with no explicit dependency: a fully-connected co-change clique, not 3 separate couplings. They share one concern (thin parallel siblings over a common abstraction), so extract the shared part into ONE unit and the whole clique\u0027s coupling clears at once \u2014 you do not need to break each pair individually."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/ellipsis.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f43372e1f06ddf7e842bae8798b0e641006dcbe25a6b86c81036689ca7c308bb"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: array.rs \u2194 vec.rs: \u0060src/conversions/std/array.rs\u0060 and \u0060src/conversions/std/vec.rs\u0060 change together 82% of the time (9 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u006074d16b00\u0060 Introspection: use \u0060SupportsGetItem\u0060/\u0060SupportsLenAndGetItem\u0060 instead \u2026; \u0060ec7a0dc9\u0060 extract_sequence: avoid a not useful cast (#5800); \u00605e6df2d3\u0060 Cow\u003C[u8]\u003E FromPyObject impl: allow any Sequence[int] (#5667) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/conversions/std/array.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"114af70d9ba4a17f8263910711fe9da5162cd03ff2fd8a6562e1eadd3a00dc27"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: frozenset.rs \u2194 set.rs: \u0060src/types/frozenset.rs\u0060 and \u0060src/types/set.rs\u0060 change together 79% of the time (23 of the 29 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 23 shared commits counted here, the most recent 3 are \u0060efa8b5dd\u0060 Use PySet_GET_SIZE for sets and frozensets (#6226); \u0060c9dbdcba\u0060 Conversions: make use of public APIs to construct set and list (#5801); \u00600f4c7ca2\u0060 remove redundant counters for remaining elements in set and frozenset\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/frozenset.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3014dd426d3e1d3eace2ec51f951bce783147294e5a13c1de63af53bd6c1cfb3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: introspection.rs \u2194 stubs.rs: \u0060pyo3-introspection/src/introspection.rs\u0060 and \u0060pyo3-introspection/src/stubs.rs\u0060 change together 68% of the time (15 of the 22 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 15 shared commits counted here, the most recent 3 are \u0060e8701ab6\u0060 Introspection: generate nested classes for complex enums (#5708); \u0060cb0c4616\u0060 Introspection: use pyclass introspection ids in the type hint express\u2026; \u0060185e6b34\u0060 Stub generation \u0026 introspection: emit async keyword for async functio\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-introspection/src/introspection.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7a907f207d7b1c1f8f0581316554002181b108098b021a8667dde5d2d3ded07"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: mapping.rs \u2194 sequence.rs: \u0060src/types/mapping.rs\u0060 and \u0060src/types/sequence.rs\u0060 change together 68% of the time (25 of the 37 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 25 shared commits counted here, the most recent 3 are \u006019eff32f\u0060 Introspection: add TYPE_HINT to PyTypeInfo manual implementations (#5\u2026; \u0060c5c941e1\u0060 PyIterator, PyMapping, PySequence: implement PyTypeInfo (#5402); \u0060011916f4\u0060 Introspection: Adds basic input type annotations (#5089) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/types/mapping.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"965645b34ca38d03671135b8cbffcce5d598380c37a94277218ede945a6c1a17"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: object.rs \u2194 pyerrors.rs: \u0060pyo3-ffi/src/cpython/object.rs\u0060 and \u0060pyo3-ffi/src/cpython/pyerrors.rs\u0060 change together 60% of the time (6 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00605635b0f1\u0060 Bump supported cpython version to 3.14 for testing (#4811); \u00609e63b34c\u0060 Fix struct layouts on GraalPy (#4802); \u0060621898b0\u0060 ci: add Python 3.12-dev jobs \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyo3-ffi/src/cpython/object.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"162c7c20625226f4efe1554785155f4adb9caede5b157f4a6c27a1c279d08d2b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: exceptions.rs \u2194 traceback.rs: \u0060src/exceptions.rs\u0060 and \u0060src/types/traceback.rs\u0060 change together 54% of the time (7 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u006018bca6ec\u0060 reintroduce \u0060PyErr\u0060 constructors and methods (#4475); \u0060a9390068\u0060 Deprecate Py::into_ref (#3867); \u0060940804fe\u0060 Pyerr value bound (#3820) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/exceptions.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65b230fb68ec732dfb1337b9777198d31c5b4e89cd85b8db5fbde306236ed252"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: num_bigint.rs \u2194 num_complex.rs: \u0060src/conversions/num_bigint.rs\u0060 and \u0060src/conversions/num_complex.rs\u0060 change together 53% of the time (9 of the 17 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u006062094e39\u0060 internal: add safety comments in conversions (num-rational, num-compl\u2026; \u0060c77b8536\u0060 use unique module names in unit and integration tests (#4501); \u00605ca81023\u0060 ci: rework GitHub caching strategy (#3886) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/conversions/num_bigint.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b056ce0e6c9c09773a43f6dd03cee93829bc6923b20f63faa6515ce6b7dd54d"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0752d0df7434000fcabf1048e2de30a7a1a8b982b3db9a19898c4dec199856b4"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d068c977b62d9a977df1bb6f53e8b00b586c3abee955f91d715f92b8e019d624"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5e4607103018ccbf4772504c4475df05c43062f243e17471503584c98dc62fdc"}},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4f1e7684f8281bd255ddef97105c7055c2ebae06964c8745716b83e174debe83"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 1/4 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060.\u0060, \u0060pyo3-ffi-check\u0060, \u0060pyo3-introspection\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-250","guid":"52ee12e8-390a-7351-b1e6-388afa694e54","name":"CWE-250","shortDescription":{"text":"CWE-250"},"helpUri":"https://cwe.mitre.org/data/definitions/250.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"CWE-506","shortDescription":{"text":"CWE-506"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-522","guid":"71fb233e-ce6a-ae57-9419-ef8373540b09","name":"CWE-522","shortDescription":{"text":"CWE-522"},"helpUri":"https://cwe.mitre.org/data/definitions/522.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"CWE-829","shortDescription":{"text":"CWE-829"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":174,"secretScannerRunsExcluded":0}},"redactionTokens":["A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."]}]}