{"$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":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"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":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"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":"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":"P10","name":"Library API \u0026 versioning","shortDescription":{"text":"Library API \u0026 versioning"},"helpUri":"https://codehealth.canine.dev/dimensions/P10"},{"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":"PF1","name":"Benchmark discipline","shortDescription":{"text":"Benchmark discipline"},"helpUri":"https://codehealth.canine.dev/dimensions/PF1"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R5","name":"Dependency Freshness","shortDescription":{"text":"Dependency Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/R5"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"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":"StructurallyValidatedTypeShapeDslFunction::evaluate_expression (cyclomatic 247): StructurallyValidatedTypeShapeDslFunction::evaluate_expression has cyclomatic complexity 247 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6770}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7e292534432c3fcb674fcd30705ef539339a17c9e118ff3a99d2404debe06f7"}},{"ruleId":"D1","level":"warning","message":{"text":"Subset::is_subset_eq_no_recursive_check (cyclomatic 240): Subset::is_subset_eq_no_recursive_check has cyclomatic complexity 240 (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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1877}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7def1c8a1b703514ae56c465e2df603a04418c55cb7a6f45931b54b14a2d66"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::stmt_impl (cyclomatic 157): BindingsBuilder::stmt_impl has cyclomatic complexity 157 (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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":847}}}],"partialFingerprints":{"codehealthFindingId/v1":"97b66fe51acbbe2ef2033346c29f53f9bdabce1b5031ec5788f3f4dd5569ee8e"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeDisplayContext::fmt_helper_generic (cyclomatic 148): TypeDisplayContext::fmt_helper_generic has cyclomatic complexity 148 (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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"c93d3a904299e0111a20d1c421a8a44ba7f11f9f84117f9da3ec638e4d093433"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::callable_infer_params (cyclomatic 136): AnswersSolver::callable_infer_params has cyclomatic complexity 136 (threshold 15). Of this number, 134 points are the body\u0027s own statements and 2 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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cc0072f1fb7f0fe18fc72723affd7a23a774322c32ed68be8343a519df8a5f6"}},{"ruleId":"D1","level":"warning","message":{"text":"Server::process_event (cyclomatic 128): Server::process_event has cyclomatic complexity 128 (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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":2054}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dd605984ac0bfcfb9336fb6395da5f98fa5294bf6ddf82ff993409a6e87b172"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::calculate_class_field (cyclomatic 119): AnswersSolver::calculate_class_field has cyclomatic complexity 119 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1524}}}],"partialFingerprints":{"codehealthFindingId/v1":"13bd1ae890fee0559f0a7af2eac62c6fa3801a8d6100fbe9cf4e8d5dd687667b"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::atomic_narrow (cyclomatic 119): AnswersSolver::atomic_narrow has cyclomatic complexity 119 (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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1352}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa747627ee5f3c0f45da8ce78cbd30ea585818d31138fd989ee5e27c9b5b3907"}},{"ruleId":"D1","level":"warning","message":{"text":"StructurallyValidatedTypeShapeDslFunction::evaluate_condition (cyclomatic 105): StructurallyValidatedTypeShapeDslFunction::evaluate_condition has cyclomatic complexity 105 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7795}}}],"partialFingerprints":{"codehealthFindingId/v1":"11212996d9887d82fbf699f6e179250b10671caefc38ac85e7ac8a8241c4aaf4"}},{"ruleId":"D1","level":"warning","message":{"text":"DefinitionsBuilder::stmt (cyclomatic 90): DefinitionsBuilder::stmt has cyclomatic complexity 90 (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":"pyrefly/lib/export/definitions.rs"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c17beb89d53adf967140b55d397b899b86eded14af3df742a1a1f0d9cfd390"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::as_call_target_impl (cyclomatic 88): AnswersSolver::as_call_target_impl has cyclomatic complexity 88 (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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c4c8bb36a81954a532a7fda6fc2e6ea0f7483393e1e7bc05a0d12070963b2b"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::subscript_infer_for_type_with_key_present_inner (cyclomatic 84): AnswersSolver::subscript_infer_for_type_with_key_present_inner has cyclomatic complexity 84 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3367}}}],"partialFingerprints":{"codehealthFindingId/v1":"4863e03e10a36ca353838007e69f6e34fa5a3487212f0b1e13e9eb00f169332b"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_condition (cyclomatic 79): DslValidator::validate_condition has cyclomatic complexity 79 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":4461}}}],"partialFingerprints":{"codehealthFindingId/v1":"4093e1077c7642ca782ce368924ce61fdc379030d58db7fb06eb3dd586aaec15"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::ensure_expr (cyclomatic 78): BindingsBuilder::ensure_expr has cyclomatic complexity 78 (threshold 15). Of this number, 77 points are the body\u0027s own statements and 1 belongs to one function item inside it that branches. 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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c41e94b5b65ef2dd5c56a8ebadca19bf155cd178b9c52262c312cdd93a1772"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::lookup_attr_static1 (cyclomatic 77): AnswersSolver::lookup_attr_static1 has cyclomatic complexity 77 (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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":1737}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ee9026f8fa835773273bacd6747c551c1513378b547c1f006d29438abe679e3"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::bind_pattern (cyclomatic 76): BindingsBuilder::bind_pattern has cyclomatic complexity 76 (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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"87ab1584d93424277769ab7e42c405c498242f7385b81ad4616659f42e9f4b2e"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::as_attribute_base1 (cyclomatic 75): AnswersSolver::as_attribute_base1 has cyclomatic complexity 75 (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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2530}}}],"partialFingerprints":{"codehealthFindingId/v1":"47bf412b0382c7ca4367a9413905e0dae888d9148557963731636504e1e9462b"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::validate_type_shape_dsl_declaration (cyclomatic 75): AnswersSolver::validate_type_shape_dsl_declaration has cyclomatic complexity 75 (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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9162f489e7e86f3ef7a45d230ee8fb5b7354c4315d0c1d7da2a67a8c7d80bb8"}},{"ruleId":"D1","level":"warning","message":{"text":"Binding::fmt (cyclomatic 74): Binding::fmt has cyclomatic complexity 74 (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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":2699}}}],"partialFingerprints":{"codehealthFindingId/v1":"5174fc66a9e89121d4e1324fc3e5cef38d837b82ab9bdc371cbc93f284cb2db8"}},{"ruleId":"D1","level":"warning","message":{"text":"Subset::is_subset_param_list_impl (cyclomatic 71): Subset::is_subset_param_list_impl has cyclomatic complexity 71 (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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"da9bcdd2104a88fd3d31366789937fa1a1f372f9ab49bba469a7879dd0ca9b46"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::expr_infer_impl_helper (cyclomatic 66): AnswersSolver::expr_infer_impl_helper has cyclomatic complexity 66 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc325aa8deb828a52486b32da295bdb9a39b93e21727ecff69956d368d52bf6b"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::check_consistent_override_for_field (cyclomatic 64): AnswersSolver::check_consistent_override_for_field has cyclomatic complexity 64 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":4060}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cbc1bc31867734ff5508172571610f8ad176c34848214805e8c6bb8947cb65d"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::binding_to_type (cyclomatic 62): AnswersSolver::binding_to_type has cyclomatic complexity 62 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6303}}}],"partialFingerprints":{"codehealthFindingId/v1":"856492774b48f9bbd615097ac695785df1f7c2f36eb868acb611a5d4ef26adc3"}},{"ruleId":"D1","level":"warning","message":{"text":"ConfigFile::configure_at (cyclomatic 59): ConfigFile::configure_at has cyclomatic complexity 59 (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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1578}}}],"partialFingerprints":{"codehealthFindingId/v1":"74b3e45d865f337b4f8ca5d0deea30dfc009b77ebc755c81492595dadebe45ec"}},{"ruleId":"D1","level":"warning","message":{"text":"NarrowOps::from_expr_helper (cyclomatic 55): NarrowOps::from_expr_helper has cyclomatic complexity 55 (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":"pyrefly/lib/binding/narrow.rs"},"region":{"startLine":889}}}],"partialFingerprints":{"codehealthFindingId/v1":"327c6d71b4474e5d55b251de290639c00c2c81453c595b4c270faf0d5395b7f7"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::eval_dsl_expr (cyclomatic 54): pyrefly_types::meta_shape_dsl::eval_dsl_expr has cyclomatic complexity 54 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2373}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ff88aeb10ef3e6fd5655fd26955c7d9a330bc3c5b85fa0d336d78c4f371f09a"}},{"ruleId":"D1","level":"warning","message":{"text":"CheckArgs::finish_cli_run (cyclomatic 54): CheckArgs::finish_cli_run has cyclomatic complexity 54 (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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":1893}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ac8c35b170c8b2cf4f7dda99c7745e162303bcefcf8b5fd139b46868aa94223"}},{"ruleId":"D1","level":"warning","message":{"text":"Subset::is_subset_eq_var (cyclomatic 54): Subset::is_subset_eq_var has cyclomatic complexity 54 (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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3727}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bcd2d5df702415d1bddcb27ac428a9c0aeec5d6c750b6e698b2a836bf3e9665"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeConverter::convert (cyclomatic 54): TypeConverter::convert has cyclomatic complexity 54 (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":"pyrefly/lib/tsp/type_conversion.rs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"5994b1cb1f7f1df47eb2ad4d70d37cd30734067f9862a24e6cb7d0b73e9efcc4"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::solve_expectation (cyclomatic 53): AnswersSolver::solve_expectation has cyclomatic complexity 53 (threshold 15). Of this number, 48 points are the body\u0027s own statements and 5 belong to one function item inside it that branches. 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":2579}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd3dbb360f2de20269670912d98c211bea4f3a666268105e14de882fbc3353d"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_return (cyclomatic 49): DslValidator::validate_return has cyclomatic complexity 49 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":4946}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c4fda9b05621422c15b4bf0211d7f1793e1f39644bab9651a2d3539066c211"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::as_attribute_base1_of_type (cyclomatic 49): AnswersSolver::as_attribute_base1_of_type has cyclomatic complexity 49 (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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2814}}}],"partialFingerprints":{"codehealthFindingId/v1":"fed1c3d936cef7b32c5142f3b5fc4136aa026e8ccc3e29907c241757edde5f9f"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::inlay_hints (cyclomatic 49): Transaction::inlay_hints has cyclomatic complexity 49 (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":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c2ff4df564f7e0f592dc3630bb50abae61fbe8ab91836198551bb08547d4df0"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::call_functools_partial (cyclomatic 48): AnswersSolver::call_functools_partial has cyclomatic complexity 48 (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":"pyrefly/lib/alt/functools.rs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"188f0341d2683847256bfc26dfcf53c33d9dec5954cdb72f1c24a599fbc752e3"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::convert_expr (cyclomatic 47): pyrefly_types::meta_shape_dsl::convert_expr has cyclomatic complexity 47 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1030}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a9d1bc7d2a3d0cf658dc7d0d2b591acac980c2b5b7317d04ce40b55cb78fc09"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::class_metadata_of (cyclomatic 47): AnswersSolver::class_metadata_of has cyclomatic complexity 47 (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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb8b17c29ebeb2114b48a9a9ab848695d57d6cebddc5a55b969aca89662f11ff"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::completion_sorted_opt_with_incomplete (cyclomatic 47): Transaction::completion_sorted_opt_with_incomplete has cyclomatic complexity 47 (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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":1068}}}],"partialFingerprints":{"codehealthFindingId/v1":"025b630631946c123a643db622e6921c22edef3edf82422cd7416c88aa7dbc53"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::report::cinderx::convert::type_to_structured (cyclomatic 47): pyrefly::lib::report::cinderx::convert::type_to_structured has cyclomatic complexity 47 (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":"pyrefly/lib/report/cinderx/convert.rs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"40bc46b5a219c817e116b9eced2c0d9ff4924268be829f4461f30864203eec82"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::find_definition (cyclomatic 46): Transaction::find_definition has cyclomatic complexity 46 (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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2676}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed7fe8d4987493d2481678e9402c8dbccc40c8130bd1d9358c9d2447ed0c9bff"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::subscript_str_literal (cyclomatic 43): AnswersSolver::subscript_str_literal has cyclomatic complexity 43 (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":"pyrefly/lib/alt/subscript.rs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"172eb69fe71e9904eb3b98d9fc876dd3ee4266555414d55199fcbc8a3697f455"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::narrow (cyclomatic 42): AnswersSolver::narrow has cyclomatic complexity 42 (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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":2031}}}],"partialFingerprints":{"codehealthFindingId/v1":"117e435678a3e222e2424f2fa9f46a3b70ed8aecbc8f48e7850c6764672805c3"}},{"ruleId":"D1","level":"warning","message":{"text":"SysInfo::evaluate (cyclomatic 41): SysInfo::evaluate has cyclomatic complexity 41 (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":"crates/pyrefly_python/src/sys_info.rs"},"region":{"startLine":898}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9adda22b16792b33ec8900b676cee5956e407f44cb24d451df0837313a403d6"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::shape_index::lower_index_type_in_position (cyclomatic 40): pyrefly_types::shape_index::lower_index_type_in_position has cyclomatic complexity 40 (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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f7f3bbf6bc950442e2d7956986a2817e6ce2283167be0cbae0f48d3edc2a52d"}},{"ruleId":"D1","level":"warning","message":{"text":"Server::code_action (cyclomatic 40): Server::code_action has cyclomatic complexity 40 (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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4964}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28236ea8c916d4b99a95023cee2a8e5c9d6dc8028f503c3ff685a2ac2ade470"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::expr_call_infer (cyclomatic 39): AnswersSolver::expr_call_infer has cyclomatic complexity 39 (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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":2543}}}],"partialFingerprints":{"codehealthFindingId/v1":"23ab2f84c28be237b58c2f6c56094a9d084aa17846cca5dcf7ef7b14f3de3366"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::decorated_function_type (cyclomatic 39): AnswersSolver::decorated_function_type has cyclomatic complexity 39 (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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2f7282e9321a1328a9ae2be2307a989edb0c924901cd29ec5cd77d75076a87"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::local_quickfix_code_actions_sorted (cyclomatic 39): Transaction::local_quickfix_code_actions_sorted has cyclomatic complexity 39 (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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":3328}}}],"partialFingerprints":{"codehealthFindingId/v1":"262ccfa2460886362705034ed1070bcb4c41eb8953c8a7dcdb770c1ba8612d12"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_python::folding::folding_ranges (cyclomatic 38): pyrefly_python::folding::folding_ranges has cyclomatic complexity 38 (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":"crates/pyrefly_python/src/folding.rs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab660406b694e10a5b8518c92bc408a68f57e3b4e3b8e8806a99874f5a7d0f57"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::simplify::collapse_literals (cyclomatic 38): pyrefly_types::simplify::collapse_literals has cyclomatic complexity 38 (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":"crates/pyrefly_types/src/simplify.rs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b060acbc26f53f13610dd0e955b37e887b43c402849fd62166fa34e714a43b8"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeCheckKind::format_error (cyclomatic 38): TypeCheckKind::format_error has cyclomatic complexity 38 (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":"pyrefly/lib/error/display.rs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"a56152c4b958d7650423b63a5d6e497dc096f8da03756608fc66f3f0dc234deb"}},{"ruleId":"D1","level":"warning","message":{"text":"StructurallyValidatedTypeShapeDslFunction::evaluate_generator (cyclomatic 37): StructurallyValidatedTypeShapeDslFunction::evaluate_generator has cyclomatic complexity 37 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6510}}}],"partialFingerprints":{"codehealthFindingId/v1":"a44d0b0bb5d948c5baa6fba6ec3ecb1bedd68e7b0b81998e49acce4640e836bc"}},{"ruleId":"D1","level":"warning","message":{"text":"Solver::finish_quantified_with_captures (cyclomatic 37): Solver::finish_quantified_with_captures has cyclomatic complexity 37 (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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":2103}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4dcddcf6e3797fc8c2065781bf4a755a9c79efd8f08ed4924889c8eaa2fa66a"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::parse_functions (cyclomatic 37): pyrefly::lib::commands::coverage::collect::parse_functions has cyclomatic complexity 37 (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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"487700d16d87ac6f3e0fcff1609ddc661f62b1455f4ea19f350456f0cdedeb17"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::call_infer_with_callee_range (cyclomatic 36): AnswersSolver::call_infer_with_callee_range has cyclomatic complexity 36 (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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":1759}}}],"partialFingerprints":{"codehealthFindingId/v1":"17014800c52b01f34244783e2e3a828af3961fd94b6ea700c0bc5798774f833f"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::parse_dimension_expr_with_context (cyclomatic 36): AnswersSolver::parse_dimension_expr_with_context has cyclomatic complexity 36 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":4342}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f3e88a8dc379e1959439f8f2e0e0ebe58be472e41fed53ee98ef30b231fe83d"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::untype_opt_with_context (cyclomatic 36): AnswersSolver::untype_opt_with_context has cyclomatic complexity 36 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6962}}}],"partialFingerprints":{"codehealthFindingId/v1":"33cff72fef61b1768f9464ef0f24b623e5bf501f1bb58cbc3ad7d4ca5aeafd26"}},{"ruleId":"D1","level":"warning","message":{"text":"SemanticTokenBuilder::process_stmt (cyclomatic 36): SemanticTokenBuilder::process_stmt has cyclomatic complexity 36 (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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"394328d6cf6fdf6f6d30c2ee3c09899aa38c65905584b80c51151033b28fb58d"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::demand (cyclomatic 36): Transaction::demand has cyclomatic complexity 36 (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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1457}}}],"partialFingerprints":{"codehealthFindingId/v1":"a38ea66f55eb9fe225f56dd6db86cb0eef25c6cab4c832cd6766471c096880ef"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::try_int_binop (cyclomatic 35): AnswersSolver::try_int_binop has cyclomatic complexity 35 (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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"9307c301b2fd91b73cea477d2a61cc4e32faea4b4c760864ac5cd5288abac37e"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::ensure_type_impl (cyclomatic 35): BindingsBuilder::ensure_type_impl has cyclomatic complexity 35 (threshold 15). Of this number, 34 points are the body\u0027s own statements and 1 belongs to one function item inside it that branches. 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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":1282}}}],"partialFingerprints":{"codehealthFindingId/v1":"88b9457e86292403f8b79eb7ab6bc4c58ca16a5f82f9b813ed6e5bd99e12a61c"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::apply_special_form (cyclomatic 34): AnswersSolver::apply_special_form has cyclomatic complexity 34 (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":"pyrefly/lib/alt/specials.rs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a488511a1bf07d7cb5e649ac73f56643d1b2613f45a18e39ebc30a0f84a9eaa"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::resolve_type_shape_dsl_intrinsic (cyclomatic 34): AnswersSolver::resolve_type_shape_dsl_intrinsic has cyclomatic complexity 34 (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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":915}}}],"partialFingerprints":{"codehealthFindingId/v1":"a55567d89ad3c838379ed4937659fb10116bcaa5c23ca8b9820467100a34d008"}},{"ruleId":"D1","level":"warning","message":{"text":"ConfigOverrideArgs::override_config_at (cyclomatic 33): ConfigOverrideArgs::override_config_at has cyclomatic complexity 33 (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":"crates/pyrefly_config/src/args.rs"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"636108d24192483d4090907d9d7c553f31d6da97b9763745ca5ec26ea1d59bf4"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::binding::attrs::collect_attrs_decorator_methods (cyclomatic 33): pyrefly::lib::binding::attrs::collect_attrs_decorator_methods has cyclomatic complexity 33 (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":"pyrefly/lib/binding/attrs.rs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"a183e1713f9be3bf416043254a9f311fa0170e102bff0378eea7557398770d0b"}},{"ruleId":"D1","level":"warning","message":{"text":"primer_impact.compute_primer_impact (cyclomatic 33): primer_impact.compute_primer_impact has cyclomatic complexity 33 (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":"scripts/issue_ranker/passes/primer_impact.py"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"89047b4c1083662761b83569c482a3e0244f52ec1c6f47455b3c2353217d38ff"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::infer_expr (cyclomatic 32): pyrefly_types::meta_shape_dsl::infer_expr has cyclomatic complexity 32 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2049}}}],"partialFingerprints":{"codehealthFindingId/v1":"83bcc1ad70929961f9b497371e05e64ed3fd315ee1f5845134c5ff52918c42af"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::infer_shaped_array_index (cyclomatic 32): AnswersSolver::infer_shaped_array_index has cyclomatic complexity 32 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3976}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d35f3809fe33d0c42c6f309ba7d2d4c9ae73940761fa649e37e3518581aae32"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::alt::regex::validate_pattern (cyclomatic 32): pyrefly::lib::alt::regex::validate_pattern has cyclomatic complexity 32 (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":"pyrefly/lib/alt/regex.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"dabf82524205f279688d34005177ee9693bbcf82b78156d36a57040eaab19308"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_config::migration::mypy::pyproject::pyproject_to_ini (cyclomatic 31): pyrefly_config::migration::mypy::pyproject::pyproject_to_ini has cyclomatic complexity 31 (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":"crates/pyrefly_config/src/migration/mypy/pyproject.rs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fae25bafe1e1d00933b2ecc20c206c15ae02faf36ff0588d464f139a5e89aab"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::eval_call (cyclomatic 31): pyrefly_types::meta_shape_dsl::eval_call has cyclomatic complexity 31 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2946}}}],"partialFingerprints":{"codehealthFindingId/v1":"87cfd21be86a0ab5f4f58112a52e9c001c55c857970172dd32da026dc645b812"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::construct_class_inner (cyclomatic 31): AnswersSolver::construct_class_inner has cyclomatic complexity 31 (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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":1230}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d5a786625945dfddd25640773093c84f83ed9cddbd7d22cb82d6318f20f5f9a"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::callable_infer_inner (cyclomatic 31): AnswersSolver::callable_infer_inner has cyclomatic complexity 31 (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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":2207}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a22b0fed83da0a685392278204763dfd0674dd73a1c1c38ae72ec6435bb661d"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::polars_join (cyclomatic 31): AnswersSolver::polars_join has cyclomatic complexity 31 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":3225}}}],"partialFingerprints":{"codehealthFindingId/v1":"78c94a5173bc5867fe5fc6976a6fe4f449df2257f7fd6bdccc9a198bae93268a"}},{"ruleId":"D1","level":"warning","message":{"text":"Subset::is_subset_tuple (cyclomatic 31): Subset::is_subset_tuple has cyclomatic complexity 31 (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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed4a4f3a9fa3e8f35e498980b7ee17fc8d1312b2e235f454d0aa39ecbb26013c"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::einops::evaluate_einops_pattern (cyclomatic 30): pyrefly_types::einops::evaluate_einops_pattern has cyclomatic complexity 30 (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":"crates/pyrefly_types/src/einops.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cb3affc6b003f4e4ef5a83890f1b8a39d5b0f744ef62453e0b6b8cab8b8a83c"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::dict_items_infer_inner (cyclomatic 29): AnswersSolver::dict_items_infer_inner has cyclomatic complexity 29 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1885}}}],"partialFingerprints":{"codehealthFindingId/v1":"aad480c2d60eaffa28376b56bdc25d0a3d8548b9ac847775cfd090a7d2779a16"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::undecorated_function (cyclomatic 29): AnswersSolver::undecorated_function has cyclomatic complexity 29 (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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f938a8a91be016fa64d7350f540cf139244dbc7e537f42a35c318bd1e3db42"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::get_params_and_paramspec (cyclomatic 29): AnswersSolver::get_params_and_paramspec has cyclomatic complexity 29 (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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":1316}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef0aac07b81d0407c7ec0591dc7fc96894db99ebb881d6342e40564ec6deea9f"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::check_shape_flag_constructor_sources (cyclomatic 29): AnswersSolver::check_shape_flag_constructor_sources has cyclomatic complexity 29 (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":"pyrefly/lib/alt/shape_flag.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"89cbafcdefc588693fdb672d06a56ca9f14b73afd11500af1cbc4551a903b416"}},{"ruleId":"D1","level":"warning","message":{"text":"Subset::bind_tensor_dimensions (cyclomatic 29): Subset::bind_tensor_dimensions has cyclomatic complexity 29 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 2 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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":3227}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d09e789468cab566d79055d147c330e9d60c5bc08d241f2a2d5f3d90bb3405"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeShapeDslHelperCall::argument_domains (cyclomatic 28): TypeShapeDslHelperCall::argument_domains 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3b57a0f2efb703f91cc7afd39a3b9961d81490153d63782360b7d742a11c9d2"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_dimension (cyclomatic 28): DslValidator::validate_dimension has cyclomatic complexity 28 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2492}}}],"partialFingerprints":{"codehealthFindingId/v1":"d27422aeb8713aa66aa000e1afa4c242ace92394b7f2e1844db415a729cbdda5"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::binding::function::function_last_expressions::f (cyclomatic 28): pyrefly::lib::binding::function::function_last_expressions::f 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":"pyrefly/lib/binding/function.rs"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"d34b6e8aeaf88af3e344ae501bc3bcf57cab31ea49866c4baba9eda54730ee59"}},{"ruleId":"D1","level":"warning","message":{"text":"compare_typecheckers.check_project (cyclomatic 28): compare_typecheckers.check_project has cyclomatic complexity 28 (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":"scripts/compare_typecheckers.py"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"aad1a040d9d156c466aac99399f84f0635925a5584fe8af8341f1033cd88550e"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::einops::parse_expression (cyclomatic 27): pyrefly_types::einops::parse_expression has cyclomatic complexity 27 (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":"crates/pyrefly_types/src/einops.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80b6329771160eff7d6510978fe11bdf3b2edc39d2caf33f511dc3c22276e63"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::eval_binop (cyclomatic 27): pyrefly_types::meta_shape_dsl::eval_binop has cyclomatic complexity 27 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2799}}}],"partialFingerprints":{"codehealthFindingId/v1":"88e84309eb500f35bc0d314b003f24199a1eff96e6ac8530e334a188058e3e05"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::stmt_match (cyclomatic 27): BindingsBuilder::stmt_match has cyclomatic complexity 27 (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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":871}}}],"partialFingerprints":{"codehealthFindingId/v1":"11ba8d8b1ea82d838c28f832670cd7005a0f8abb76da940f5820889411f08779"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::error::suppress::remove_unused_ignores_from_serialized (cyclomatic 27): pyrefly::lib::error::suppress::remove_unused_ignores_from_serialized has cyclomatic complexity 27 (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":"pyrefly/lib/error/suppress.rs"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e287a1d7e926fdbd13c00f30dadf31aff8b3e2bbacf1024a25ba5745dd0f6f5"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::get_dataclass_synthesized_fields (cyclomatic 26): AnswersSolver::get_dataclass_synthesized_fields has cyclomatic complexity 26 (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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc5bb4ec7feedd47aa77a70a0cd723d3358f90efa51a3bc316a60dec8e3ecde0"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::parse_registered_shaped_array_type (cyclomatic 26): AnswersSolver::parse_registered_shaped_array_type has cyclomatic complexity 26 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":5146}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a359c261a3e5b2027991d8aa48aaac14f9e3caa1a9e3c87ec149be84cd227a7"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::binding_to_type_unpacked_value (cyclomatic 26): AnswersSolver::binding_to_type_unpacked_value has cyclomatic complexity 26 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4820}}}],"partialFingerprints":{"codehealthFindingId/v1":"66c9a211e2b4a113c77b0feeac2ed15d79063defd875ba2a0315cd6581a993f4"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::validate_type_form (cyclomatic 26): AnswersSolver::validate_type_form 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":7196}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f8fb08ce23c2b3f5704d05f99a65a427c0fd06dc479ed20d51b1289002b6297"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::check_type_is_class_object (cyclomatic 26): AnswersSolver::check_type_is_class_object has cyclomatic complexity 26 (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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdda73d6196af23ac022f58ea99716c50ccd69b1b375b29307ef2dfce4f67353"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::parse_variables (cyclomatic 26): pyrefly::lib::commands::coverage::collect::parse_variables has cyclomatic complexity 26 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 9 belong to 2 function items inside it that branch. 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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e41b24521883e59e3267b06ec08008fe52c009e180831f4d1a752bc25004f10"}},{"ruleId":"D1","level":"warning","message":{"text":"cross_checker.cross_check_projects (cyclomatic 26): cross_checker.cross_check_projects has cyclomatic complexity 26 (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":"scripts/primer_classifier/cross_checker.py"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea34177ed4a83a45c8368c3d8535dcf065c73ab2f3952e170ff8cd6ab54d5764"}},{"ruleId":"D1","level":"warning","message":{"text":"PolarsScalarDType::supertype (cyclomatic 25): PolarsScalarDType::supertype has cyclomatic complexity 25 (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":"crates/pyrefly_types/src/polars_dtype.rs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"067529e0f3ac1ae62c5d0194e7ae807d6de5dc13008c826997bce19a2efbc071"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_generator_source (cyclomatic 25): DslValidator::validate_generator_source has cyclomatic complexity 25 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3086}}}],"partialFingerprints":{"codehealthFindingId/v1":"37586f0a2510ba5f77faf6e2ee696c932e73d96110bae400351a8d8c923612cf"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_generator (cyclomatic 25): DslValidator::validate_generator has cyclomatic complexity 25 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3284}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c16032ef480f2d04e697e9893bd6a650c6c4108baca9bf268a4160ade362ce8"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::tuple_infer (cyclomatic 25): AnswersSolver::tuple_infer has cyclomatic complexity 25 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1602}}}],"partialFingerprints":{"codehealthFindingId/v1":"873d0e141514bc0204a5251a8133b4c9f6deb7b6d75c14025f9b3c8bf47350ff"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::overload_error (cyclomatic 25): AnswersSolver::overload_error has cyclomatic complexity 25 (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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"df828b714c84ed0ef358c0630410437e1759e0c3e9e41282bf22136b49b3ca8b"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::validate_type_var_default (cyclomatic 25): AnswersSolver::validate_type_var_default has cyclomatic complexity 25 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 2 belong to one function item inside it that branches. 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3564}}}],"partialFingerprints":{"codehealthFindingId/v1":"c724c1df72f9a8b4da1ec5f71153cdef8380a4e84d70f8af120182172ad5127b"}},{"ruleId":"D1","level":"warning","message":{"text":"CalleesWithLocation::callee_from_type (cyclomatic 25): CalleesWithLocation::callee_from_type has cyclomatic complexity 25 (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":"pyrefly/lib/query.rs"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"dea97aed02701e5a50009ca00f759bd12b27bfc0dfc93f16481d3c16ff3016e6"}},{"ruleId":"D1","level":"warning","message":{"text":"Errors::collect_unused_ignore_errors (cyclomatic 25): Errors::collect_unused_ignore_errors has cyclomatic complexity 25 (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":"pyrefly/lib/state/errors.rs"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"74bb9d4722026f868bd540a7b9cc0fa832bacc70699a92e9135b28dd0305daa6"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::find_operator_dunder (cyclomatic 25): Transaction::find_operator_dunder has cyclomatic complexity 25 (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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2244}}}],"partialFingerprints":{"codehealthFindingId/v1":"b30bd3503e8ade477af6d1d51c4397c285fa3112fe964bf00c00a59b8658859d"}},{"ruleId":"D1","level":"warning","message":{"text":"score.score_issue (cyclomatic 25): score.score_issue has cyclomatic complexity 25 (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":"scripts/issue_ranker/passes/score.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e9ca013371d03725cb434695298a4636b35a34e8c2f1d0c3e3bdc5b0f3af9fd"}},{"ruleId":"D1","level":"warning","message":{"text":"stub_coverage._literal_all (cyclomatic 25): stub_coverage._literal_all has cyclomatic complexity 25 (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":"tensor-shapes/stub_coverage.py"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"50acead241382bb1268020b636e1cc38dfc1fa684ad63c006ab5136af456e1d6"}},{"ruleId":"D1","level":"warning","message":{"text":"extension.activate (cyclomatic 25): extension.activate has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 6 of the 25 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 454, 384, 409, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/extension.ts"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"04695d138bf41097e3ee6884714fc00f86a112aa4373da98738bfa57bf445eea"}},{"ruleId":"D1","level":"warning","message":{"text":"StructurallyValidatedTypeShapeDslFunction::evaluate_any_generator (cyclomatic 24): StructurallyValidatedTypeShapeDslFunction::evaluate_any_generator has cyclomatic complexity 24 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7664}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb9f1c113ec7648d1b9c0be55349434fe1bf07dd7312d0dbd83c6b3915532ec5"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_assignment_value (cyclomatic 24): DslValidator::validate_assignment_value has cyclomatic complexity 24 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3953}}}],"partialFingerprints":{"codehealthFindingId/v1":"f11b12f998eccc01b0be326c8109669a6e65e80076303f0d05babac8b3347cc1"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::is_class_attribute_subset (cyclomatic 24): AnswersSolver::is_class_attribute_subset has cyclomatic complexity 24 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5608}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b42085a611e0cc2ae349bf514db8f36a2b3a6a704ffb81192aee9cf3efa0a52"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::typevar_from_call (cyclomatic 24): AnswersSolver::typevar_from_call has cyclomatic complexity 24 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":2772}}}],"partialFingerprints":{"codehealthFindingId/v1":"904e7436001555971d117ea98e5b63c38a944e838995778044e9bf3274f0e4b9"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::binop_types (cyclomatic 24): AnswersSolver::binop_types has cyclomatic complexity 24 (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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"63d00a77ef83038b678835eccf039695a69866b9e0651d097034ed1baf78a88b"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::polars_expr_output_name (cyclomatic 24): AnswersSolver::polars_expr_output_name has cyclomatic complexity 24 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2719}}}],"partialFingerprints":{"codehealthFindingId/v1":"be176a43ab0cd5c15c5fd5fbd22fd36cd8caae13b5280e1d26cab0b31f439fe0"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::expr_annotation (cyclomatic 24): AnswersSolver::expr_annotation has cyclomatic complexity 24 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":794}}}],"partialFingerprints":{"codehealthFindingId/v1":"a671d264e3d00d587e5b5e0a95e293b684a3bf2c926f5b7a1976bcec7a675f05"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::class_bases_of (cyclomatic 24): AnswersSolver::class_bases_of has cyclomatic complexity 24 (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":"pyrefly/lib/alt/types/class_bases.rs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6ba9714413355e1201c4838b2e74e361304f0c3870ac55c3ca0455114b79f5"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::class_def_inner (cyclomatic 24): BindingsBuilder::class_def_inner has cyclomatic complexity 24 (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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"407e36e70dfef0211910b787bc565ae7b7b27ac29feca7185bb0336b67880261"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::function_body (cyclomatic 24): BindingsBuilder::function_body has cyclomatic complexity 24 (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":"pyrefly/lib/binding/function.rs"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3cc21180cc0dcbcf1b1f4b52c387e470eba9bcc415cbe19752308d8d982ed2a"}},{"ruleId":"D1","level":"warning","message":{"text":"InitArgs::create_config (cyclomatic 24): InitArgs::create_config has cyclomatic complexity 24 (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":"pyrefly/lib/commands/init.rs"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"95fd7adc8d20d88467f0f6ddde20387f0868eeda69ea8d5636020b9ac8bc8299"}},{"ruleId":"D1","level":"warning","message":{"text":"CallGraphVisitor::resolve_and_register_call (cyclomatic 24): CallGraphVisitor::resolve_and_register_call has cyclomatic complexity 24 (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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":3163}}}],"partialFingerprints":{"codehealthFindingId/v1":"38b2ab30e1b7425d0c35b2c61e4b447d43b678fc1e8b062ef7046a65def4daac"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::module::finder::find_import_with_mode (cyclomatic 24): pyrefly::lib::module::finder::find_import_with_mode has cyclomatic complexity 24 (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":"pyrefly/lib/module/finder.rs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e218617245af87921a1668941972ac605763c925f550bcfc4c6038414e6205b"}},{"ruleId":"D1","level":"warning","message":{"text":"generate_protocol.convert_json_to_model (cyclomatic 24): generate_protocol.convert_json_to_model has cyclomatic complexity 24 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d0b993dec390afcc5bc2eb9d59759a659ff09a8f99585585f521ad1487198ba"}},{"ruleId":"D1","level":"warning","message":{"text":"__main__.collect_issue_data (cyclomatic 24): __main__.collect_issue_data has cyclomatic complexity 24 (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":"scripts/issue_ranker/__main__.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"60583971f8be9195649ebb1d6cc22c529ba9a36bd5fbd4d165972ab8ab1d9ca6"}},{"ruleId":"D1","level":"warning","message":{"text":"formatter.format_markdown (cyclomatic 24): formatter.format_markdown has cyclomatic complexity 24 (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":"scripts/primer_classifier/formatter.py"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa3cb86ba98d69ca1f72e9bf3fb06c6f5b291ecf2c95cf98a77d7ebe34930cb"}},{"ruleId":"D1","level":"warning","message":{"text":"stub_coverage.parse_stub (cyclomatic 24): stub_coverage.parse_stub has cyclomatic complexity 24 (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":"tensor-shapes/stub_coverage.py"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"a34d18d72219d28ffe8c703bfe269d1390bf1440ee6d59af681862b8e89971bb"}},{"ruleId":"D1","level":"warning","message":{"text":"DslExpr::fmt (cyclomatic 23): DslExpr::fmt has cyclomatic complexity 23 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"44a088939209730ff917a7089b07332525c513f3acc920819dc5c4aaeca92be2"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::lookup_magic_dunder_attr1 (cyclomatic 23): AnswersSolver::lookup_magic_dunder_attr1 has cyclomatic complexity 23 (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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2169}}}],"partialFingerprints":{"codehealthFindingId/v1":"714dff4fb33b6d074003d6c214035cac234c812ff0ac7b7d52c3850ce788fa7a"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::validate_dataclass_transform_defaults (cyclomatic 23): AnswersSolver::validate_dataclass_transform_defaults has cyclomatic complexity 23 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1426}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e8138dd8d50d51b8479a9b41990d5369003d0766557a12ff5e88853c2c46605"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::parse_base_class (cyclomatic 23): AnswersSolver::parse_base_class has cyclomatic complexity 23 (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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1649}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e323c730ded04444cc1207d7b7a6cd3c57f7b6e8775cf886d1c9d9018cca24f"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::solve_function_binding (cyclomatic 23): AnswersSolver::solve_function_binding has cyclomatic complexity 23 (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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"16b19fcf9763e8d587a794592ca35bd7e56233e87f95d82477e17a27af0bcfb1"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::check_signature_consistency (cyclomatic 23): AnswersSolver::check_signature_consistency has cyclomatic complexity 23 (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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2240}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8cf9a66cb192e759ab35ac2e898c43f0fa116724ba763b25f50dcccd94684aa"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::intersect_impl (cyclomatic 23): AnswersSolver::intersect_impl has cyclomatic complexity 23 (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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bcb48c208bc93cb5d8e43403c252f5bc0b408347037bf5c012c1fb3a369fd04"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::find_closest_overload (cyclomatic 23): AnswersSolver::find_closest_overload has cyclomatic complexity 23 (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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"8850784ec859554860f4da8af5caf05b12927acc839dd52221e45f9e6c63d534"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::check_args_and_construct_tuple (cyclomatic 23): AnswersSolver::check_args_and_construct_tuple has cyclomatic complexity 23 (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":"pyrefly/lib/alt/specials.rs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"416adbdc33b54f7579fbc4506ff5a317c02d070aaa4dd92416aaf5f35b1995b0"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::merged_flow_info (cyclomatic 23): BindingsBuilder::merged_flow_info has cyclomatic complexity 23 (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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":3903}}}],"partialFingerprints":{"codehealthFindingId/v1":"226925bbc7ff91538cf216bc267c99c8100e9b3c3441596f96c3947e715576ac"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_build::module_resolver::find_one_part_in_root (cyclomatic 22): pyrefly_build::module_resolver::find_one_part_in_root has cyclomatic complexity 22 (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":"crates/pyrefly_build/src/module_resolver.rs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"e12c6b11d944bb6eb581c5e133ee28ac2a416bfb71791e622e3f61e4affbae05"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::val_to_type (cyclomatic 22): pyrefly_types::meta_shape_dsl::val_to_type has cyclomatic complexity 22 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":3302}}}],"partialFingerprints":{"codehealthFindingId/v1":"19248753552a36fa678f659c1928b990e3194afb0c3001664e835c11ff65da3a"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::get_dataclass_init (cyclomatic 22): AnswersSolver::get_dataclass_init has cyclomatic complexity 22 (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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":1266}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6087e86f2b6f6aede0056ec088126cf0f3c71ff0c74cd97c2efd6c1e951b012"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::call_overloads (cyclomatic 22): AnswersSolver::call_overloads has cyclomatic complexity 22 (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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d866ca0c0a01385770e9b21aac0fa0014cc9704bece100529322ab708165d4e"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::name_assign_infer (cyclomatic 22): AnswersSolver::name_assign_infer has cyclomatic complexity 22 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3854}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ad956133c7c3105924fe7dbfab26c5cd4469a97b429c48767d907f621b04909"}},{"ruleId":"D1","level":"warning","message":{"text":"Server::notebook_document_did_change (cyclomatic 22): Server::notebook_document_did_change has cyclomatic complexity 22 (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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4181}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aa6c28db5baf339ed09b7a2a6add3942e775d5e725b6f2ece52b37867cef025"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::collect_module_reports (cyclomatic 22): pyrefly::lib::commands::coverage::collect::collect_module_reports has cyclomatic complexity 22 (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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":1613}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d9c8599f294b7210507acdbc182591a5cd66b0ec47f0f49d95ab47e50f1031"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::alt::class::variance_inference::on_type (cyclomatic 22): pyrefly::lib::alt::class::variance_inference::on_type has cyclomatic complexity 22 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fcec824414d5fbc497596d42aa8eb46f15fc186d540423e2e3d79f192271748"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::lsp::non_wasm::server::dispatch_lsp_events (cyclomatic 22): pyrefly::lib::lsp::non_wasm::server::dispatch_lsp_events has cyclomatic complexity 22 (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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1436}}}],"partialFingerprints":{"codehealthFindingId/v1":"5747bbfa01e5f8edd17762280a9ee504cb1bf544f2145836fc889c4c4d58055f"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::constrain_forwarded_overload_return (cyclomatic 21): AnswersSolver::constrain_forwarded_overload_return 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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":1982}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f64d73c880e25d1472243a6eafdf9fb28b20c22fea78f85fdd77b606e4dbd86"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::as_instance_attribute (cyclomatic 21): AnswersSolver::as_instance_attribute 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3511}}}],"partialFingerprints":{"codehealthFindingId/v1":"10286492841e3c2f88ccbbbeb8c5a0598d38c4673144dbb405a05652335b80b3"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::check_consistent_multiple_inheritance (cyclomatic 21): AnswersSolver::check_consistent_multiple_inheritance 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":4523}}}],"partialFingerprints":{"codehealthFindingId/v1":"f647f0b860b50c55b0c84e87d72006b0615c1169d4e04e5ea323fa2ac1e74c66"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::dataframe_list_element_type (cyclomatic 21): AnswersSolver::dataframe_list_element_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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2114}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d1d1d955593eb080c0552fde9a6c47049767093a324241f625a15a794c59279"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::eval_polars_expr (cyclomatic 21): AnswersSolver::eval_polars_expr 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2507}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ac8e864fa777b906e69a09b8686cb7f811424a465e54060e12dcfeb87c69d3e"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::polars_fill_null (cyclomatic 21): AnswersSolver::polars_fill_null 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2991}}}],"partialFingerprints":{"codehealthFindingId/v1":"027e8db854772c4f26aeeb66c1d9f5c4c7807d64a5d90fc2a19f5bba9712282e"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::apply_literal (cyclomatic 21): AnswersSolver::apply_literal has cyclomatic complexity 21 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 3 belong to one function item inside it that branches. 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":"pyrefly/lib/alt/specials.rs"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"5650ae3ecf7fe46128a771adb7d157a7994a0c662d4fc91dbd09dada878201bd"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingExpect::fmt (cyclomatic 21): BindingExpect::fmt 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. This is NOT this file\u0027s highest cyclomatic complexity: Key::range (cyclomatic 28) 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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":1343}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18175b294b27be4f05e674a21c8d568cbf80d38b9d0052d28c32326c5f1b711"}},{"ruleId":"D1","level":"warning","message":{"text":"TestAssertion::to_narrow_ops (cyclomatic 21): TestAssertion::to_narrow_ops 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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"b034fa051fde28d77656a26797b5ff185b9e8118f2b1aece9ab1d7ecfe85b73f"}},{"ruleId":"D1","level":"warning","message":{"text":"GleanState::process_statement (cyclomatic 21): GleanState::process_statement 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":"pyrefly/lib/report/glean/convert.rs"},"region":{"startLine":1539}}}],"partialFingerprints":{"codehealthFindingId/v1":"f09c77fb260a133cf31d10faafc73a952288a088d39a5bd5f6b89ab8a2a24f5e"}},{"ruleId":"D1","level":"warning","message":{"text":"Solver::simplify_mut (cyclomatic 21): Solver::simplify_mut 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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1207}}}],"partialFingerprints":{"codehealthFindingId/v1":"a22dc42538b4db506368efef47c7029292a1ff88003993156958f9b07ac8ac87"}},{"ruleId":"D1","level":"warning","message":{"text":"Subset::is_subset_eq_quantified (cyclomatic 21): Subset::is_subset_eq_quantified 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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3563}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e56e2e6d8e83a04d563312c260ca629998148e454a6b63d35bf221931386d45"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::stubgen::extract::extract_stmts (cyclomatic 21): pyrefly::lib::stubgen::extract::extract_stmts 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":"pyrefly/lib/stubgen/extract.rs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"1062a088c7f2bbf2862cc810ae98f676e9373b46ed430b6dbdf552b8311a73d4"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::commands::infer::format_hints (cyclomatic 21): pyrefly::lib::commands::infer::format_hints 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":"pyrefly/lib/commands/infer.rs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b615a66426857982922581f7bcea268bb9997bd01d88dc8d550c21c88038961"}},{"ruleId":"D1","level":"warning","message":{"text":"github_utils.list_contributors_main (cyclomatic 21): github_utils.list_contributors_main 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":"scripts/github_utils.py"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"9494003ba0eaa315121c07363d00ea847b4054e303fbb9ce0445ab87a65c8b54"}},{"ruleId":"D1","level":"warning","message":{"text":"whyPyreflyGridItem.WhyPyreflyGridItem (cyclomatic 21): whyPyreflyGridItem.WhyPyreflyGridItem has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 3 of the 21 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 86, 60, 71). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"website/src/components/landing-page/whyPyreflyGridItem.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"a028372578b005000b9964c05c169d75f85f270e5e2071ab5345dab265ff39e8"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeDisplayContext::fmt_params_hover (cyclomatic 20): TypeDisplayContext::fmt_params_hover has cyclomatic complexity 20 (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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0853d50ed78c48bd46a46cc6b4bb002cee9ad88b76f40be87243d3de7890bd6"}},{"ruleId":"D1","level":"warning","message":{"text":"SideParser::parse (cyclomatic 20): SideParser::parse has cyclomatic complexity 20 (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":"crates/pyrefly_types/src/gufunc.rs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"589ad3cf08ff766b23e75c17cc4a44d820482df245a80a08b48d5ec30dd0f874"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::collect_integer_expression_sources (cyclomatic 20): DslValidator::collect_integer_expression_sources has cyclomatic complexity 20 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2168}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe3fd0330f849d5286a4f6314e1adedac0b71259bbc5957436c95b69b6ff1cf6"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::einsum::parse_einops_einsum_equation (cyclomatic 20): pyrefly_types::einsum::parse_einops_einsum_equation has cyclomatic complexity 20 (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":"crates/pyrefly_types/src/einsum.rs"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"d832a0b3e0a7965c5863bda41effc10b078c0d0fb009ca943d436e223cb5cf92"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::pydantic_config (cyclomatic 20): AnswersSolver::pydantic_config has cyclomatic complexity 20 (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":"pyrefly/lib/alt/class/pydantic.rs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ff703020cb09667e08d291e23a4a56e1e17586e093b7cd97f027a2f165d2579"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::calculate_typed_dict_field (cyclomatic 20): AnswersSolver::calculate_typed_dict_field has cyclomatic complexity 20 (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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":1000}}}],"partialFingerprints":{"codehealthFindingId/v1":"3da6b200cba4d25c70d7824e821ac139722069fb3353c5c3f45d9c0ca9d1baf1"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::decorate_returned_callable (cyclomatic 20): AnswersSolver::decorate_returned_callable 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. This is NOT this file\u0027s highest cyclomatic complexity: AnswersSolver::get_special_decorator (cyclomatic 21) 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":1791}}}],"partialFingerprints":{"codehealthFindingId/v1":"71eff2bb2ef45ce445e6bb7e88a3e276592f236b908d460a46910059a9e776c0"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::polars_construct_options (cyclomatic 20): AnswersSolver::polars_construct_options has cyclomatic complexity 20 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1965}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5a4fc7cd8bebdedbe6c13f914790a83644f957644a93a2edf6552b405ef77b6"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::bind_single_name_assign (cyclomatic 20): BindingsBuilder::bind_single_name_assign 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":"pyrefly/lib/binding/target.rs"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"004871d24d79d77272ebcae8e9e57f4a99096db0aadc4b016539e324dca2a13c"}},{"ruleId":"D1","level":"warning","message":{"text":"Scopes::finish_class_and_get_field_definitions (cyclomatic 20): Scopes::finish_class_and_get_field_definitions has cyclomatic complexity 20 (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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":3091}}}],"partialFingerprints":{"codehealthFindingId/v1":"fedc70d4a1397096bd083b77788eb02d96a4c931ed4b750fb4c1a3c1c1a2c4cc"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::dict_literal_string_literal_at (cyclomatic 20): Transaction::dict_literal_string_literal_at has cyclomatic complexity 20 (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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":626}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffaf8493e112a82616e838a15eaa90716f9b0e77ed83659bbc270358cb6cfaf8"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::clean (cyclomatic 20): Transaction::clean has cyclomatic complexity 20 (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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1292}}}],"partialFingerprints":{"codehealthFindingId/v1":"cee2ec35d0b876c2ec63b875590fa9847896d7f5e00385de2fc21e65ec73aeac"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::error::suppress::add_suppressions (cyclomatic 20): pyrefly::lib::error::suppress::add_suppressions has cyclomatic complexity 20 (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":"pyrefly/lib/error/suppress.rs"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"5437d7a6aa28b1511e1fd4eda1f77437097c6cd0a6ab8709c0c1837df1350742"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::report::cinderx::collect::collect_call_contextual_types (cyclomatic 20): pyrefly::lib::report::cinderx::collect::collect_call_contextual_types has cyclomatic complexity 20 (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":"pyrefly/lib/report/cinderx/collect.rs"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ec6bf0451ec8a192725f95b3f24d33a94ca2b77f93697b465b21b41108024df"}},{"ruleId":"D1","level":"warning","message":{"text":"generate_release_notes._fix_bug_fix_count (cyclomatic 20): generate_release_notes._fix_bug_fix_count has cyclomatic complexity 20 (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":"scripts/generate_release_notes.py"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"3724bd3c805642aad5f3c604898b6f06d5ad2387bad158f2c33a1a580342da17"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_build::module_resolver::find_one_part_prefix (cyclomatic 19): pyrefly_build::module_resolver::find_one_part_prefix 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":"crates/pyrefly_build/src/module_resolver.rs"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2c46068f69f3571cc2d5ac0232f7722d8ea203209c39d8cd8efeac987646b80"}},{"ruleId":"D1","level":"warning","message":{"text":"Value::compare (cyclomatic 19): Value::compare 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":"crates/pyrefly_python/src/sys_info.rs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fa941fb55a22c97addaf64ff1eeb1876380448060cd1d8694256fefa5ef5f21"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::dimension::canonicalize_division (cyclomatic 19): pyrefly_types::dimension::canonicalize_division 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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"975a78a2dfebfa414f21dddfad0257baeda19afbe97057b64188401e9605e41f"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::collect_call_targets_expr (cyclomatic 19): pyrefly_types::meta_shape_dsl::collect_call_targets_expr 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":3632}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c691adef20bdf8bd3c6e3f09bd250108ecaa47448d4a21c13729d82c96ecced"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::gufunc::parse_gufunc_signature (cyclomatic 19): pyrefly_types::gufunc::parse_gufunc_signature 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":"crates/pyrefly_types/src/gufunc.rs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"854e143653d621086a5836ff8df1570c6045d993b02dc157e93cdea7f483457d"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::resolve_class_attr_setter (cyclomatic 19): AnswersSolver::resolve_class_attr_setter 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5355}}}],"partialFingerprints":{"codehealthFindingId/v1":"d745ffe15228267f193bd3709a21004deb2a613f8ec3e396eb33fb282360ab49"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::polars_output_count (cyclomatic 19): AnswersSolver::polars_output_count 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2611}}}],"partialFingerprints":{"codehealthFindingId/v1":"17487be2b49701e1b935d83cb2234f1343b54f0e249a275f036d3cbaac9778aa"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::ensure_name_impl (cyclomatic 19): BindingsBuilder::ensure_name_impl 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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"625eae2f44c8651d09a62d6fbd28cafa2757f126e1eb997ee2add96e9c85e371"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::extract_pydantic_config_dict (cyclomatic 19): BindingsBuilder::extract_pydantic_config_dict 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":"pyrefly/lib/binding/pydantic.rs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"21065bd7277065d5a7745b7559f1466f0f3b6a1af03c7e2d232be7f7970186e8"}},{"ruleId":"D1","level":"warning","message":{"text":"Scopes::look_up_name_for_read (cyclomatic 19): Scopes::look_up_name_for_read 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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":3424}}}],"partialFingerprints":{"codehealthFindingId/v1":"29ff1418632044f1c1c52716d3cbc7a48f9e9db71c4ed123900f4c87cea6a3aa"}},{"ruleId":"D1","level":"warning","message":{"text":"Subset::check_targs (cyclomatic 19): Subset::check_targs has cyclomatic complexity 19 (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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":2963}}}],"partialFingerprints":{"codehealthFindingId/v1":"435311caddea9940dd13e7e40d14dc9f8e5979bad55469943cc0ac1bf3369fda"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::dict_literal_value_string_literal_at (cyclomatic 19): Transaction::dict_literal_value_string_literal_at 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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":684}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed3239cada821a8d727220b66b7c6ade12d14f0b2bc1eefebb171c57861aa757"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::extract_function::extract_function_code_actions (cyclomatic 19): pyrefly::lib::state::lsp::quick_fixes::extract_function::extract_function_code_actions 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":"pyrefly/lib/state/lsp/quick_fixes/extract_function.rs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dec759f40f501d8b998a042a08ac70528563f0a05548d97e8b7215cd5d98cf7"}},{"ruleId":"D1","level":"warning","message":{"text":"classifier.classify_project (cyclomatic 19): classifier.classify_project 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":"scripts/primer_classifier/classifier.py"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"85c085f9b605266bcea9cf939326faeb3439d92c4e0aa5b56ac8a03055e16593"}},{"ruleId":"D1","level":"warning","message":{"text":"llm_client._build_suggestion_user_prompt (cyclomatic 19): llm_client._build_suggestion_user_prompt 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":"scripts/primer_classifier/llm_client.py"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"24299d20d11055585b9af64cbd5cfdf7c4a1238de86e620f827c79c7d492b053"}},{"ruleId":"D1","level":"warning","message":{"text":"ConfigFile::from_file (cyclomatic 18): ConfigFile::from_file has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 2 function items inside it that branch (f, read_path). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1915}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c3dcf4d6b266e3941ddaa70798bb6a988ef954889e761d84f48503e8e5c618a"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_flag_int (cyclomatic 18): DslValidator::validate_flag_int has cyclomatic complexity 18 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2802}}}],"partialFingerprints":{"codehealthFindingId/v1":"07761f498b3617d60f9640841021ac89b9f5cdf2bbae80df8bf4f082332aacd3"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::dimension::int_is_provably_negative (cyclomatic 18): pyrefly_types::dimension::int_is_provably_negative has cyclomatic complexity 18 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators. This is NOT this file\u0027s highest cyclomatic complexity: pyrefly_types::dimension::compare_int (cyclomatic 19) 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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"64aa02a0b891e025b4a550417a597175b1e13ecc53ccc9bee410349d245f09e3"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::convert_call (cyclomatic 18): pyrefly_types::meta_shape_dsl::convert_call has cyclomatic complexity 18 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1303}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0489024483b0ba14c124cf264f96b66d41f1932e2937093af11bbc07daa68aa"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::shape_index::lower_integer_tuple (cyclomatic 18): pyrefly_types::shape_index::lower_integer_tuple has cyclomatic complexity 18 (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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"259054740992928c947a4d4d3f1252feed8cd84103810acdf12cd651a1e7a739"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::determine_read_only_reason (cyclomatic 18): AnswersSolver::determine_read_only_reason 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":2857}}}],"partialFingerprints":{"codehealthFindingId/v1":"26a63e74dbe278f3d6d67077c46797694a4b483d1d073d51c5507df19ae33afc"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::as_class_attribute_inner (cyclomatic 18): AnswersSolver::as_class_attribute_inner has cyclomatic complexity 18 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3665}}}],"partialFingerprints":{"codehealthFindingId/v1":"708550227bda6adc38112e24546e59f005a7916f60f0a02b6d8033060b1501b9"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::solve_django_reverse_relations (cyclomatic 18): AnswersSolver::solve_django_reverse_relations 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":"pyrefly/lib/alt/class/django.rs"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f5dab6473d2160d7555a8a5c3cd9ffd85d37e2169041e80f40d81f3d808cb3b"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::atomic_narrow_for_facet (cyclomatic 18): AnswersSolver::atomic_narrow_for_facet 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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1176}}}],"partialFingerprints":{"codehealthFindingId/v1":"14465e5c157e93284e18db2c9712b3deb713e49d9c5abca1ec75812c047c6efa"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::polars_csv_options (cyclomatic 18): AnswersSolver::polars_csv_options has cyclomatic complexity 18 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1406}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe87156823b504cb4b80971f84553197e1e93800e54617065ed4d7b5e06c80c9"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::project_regular_nested_list (cyclomatic 18): AnswersSolver::project_regular_nested_list has cyclomatic complexity 18 (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":"pyrefly/lib/alt/regular_nested_list.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"c99c5996d5e927a03aa0b51b2d0d28ac8940a5f63c29f777a8e703115c2d9118"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::solve_super_binding (cyclomatic 18): AnswersSolver::solve_super_binding 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3437}}}],"partialFingerprints":{"codehealthFindingId/v1":"515525ad0a24cbac937a2216d3b3c751eae40b962519c2cd5a0ef07c04262086"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::call_typing_cast (cyclomatic 18): AnswersSolver::call_typing_cast 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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"e642cd6a02b3e894a01809f44d5500a72d18ce912fe72b8fd0a3d65ead3cf05d"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::as_assert_in_test (cyclomatic 18): BindingsBuilder::as_assert_in_test has cyclomatic complexity 18 (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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e88f7acdebebc70eb56f775077b2e5abe1e5f1814784d13e356df056185d92"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::extract_shaped_array_metadata (cyclomatic 18): BindingsBuilder::extract_shaped_array_metadata 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":"pyrefly/lib/binding/shape_type.rs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b6f82d84d3aed0daa28477f39dacb76611e8af657c8f178bc0d282a7fa9440a"}},{"ruleId":"D1","level":"warning","message":{"text":"Scopes::current_exported_function_impl (cyclomatic 18): Scopes::current_exported_function_impl has cyclomatic complexity 18 (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":"pyrefly/lib/report/pysa/ast_visitor.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"586a0bfadabbcf5fd371a6a6c6713f680abac1b673e906d80abbcd0b50eef3a0"}},{"ruleId":"D1","level":"warning","message":{"text":"PysaModuleIndex::build (cyclomatic 18): PysaModuleIndex::build 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":"pyrefly/lib/report/pysa/module_index.rs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09720d08d90aaa1b38a6b49ebd720bdf4a1e4cace2120a3d6484209c1cdbb67"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::report::pysa::types::get_classes_of_type (cyclomatic 18): pyrefly::lib::report::pysa::types::get_classes_of_type has cyclomatic complexity 18 (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":"pyrefly/lib/report/pysa/types.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"868be9874eb44c44ddc30132f1d43e1ac4e3fcd433e7addac53b941858951488"}},{"ruleId":"D1","level":"warning","message":{"text":"generate_protocol.replace_integer_enum (cyclomatic 18): generate_protocol.replace_integer_enum 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":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":726}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ea0f1eaba42c7104865cdbc3fab3f6e13904edc44295ea75364fca2937b0c53"}},{"ruleId":"D1","level":"warning","message":{"text":"report_formatter.format_markdown (cyclomatic 18): report_formatter.format_markdown 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":"scripts/issue_ranker/report_formatter.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee14282e1c365d1296eed2aba24c745ef4bfd2f240a948968a572e54e4b53b13"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_config::migration::mypy::util::make_error_config (cyclomatic 17): pyrefly_config::migration::mypy::util::make_error_config 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. This is NOT this file\u0027s highest cyclomatic complexity: pyrefly_config::migration::mypy::util::code_to_kind (cyclomatic 37) 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":"crates/pyrefly_config/src/migration/mypy/util.rs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"a27fc902234e20695fb935ea19f6c77cd2b40683408718185d9d04a43deaa75d"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_python::ignore::parse_ignore_all (cyclomatic 17): pyrefly_python::ignore::parse_ignore_all 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":"crates/pyrefly_python/src/ignore.rs"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e2e645da2c3aaf74397dafa00dadb22df0cbdf3c48c6a7b37cba29894a3f90"}},{"ruleId":"D1","level":"warning","message":{"text":"Int::fmt_prec (cyclomatic 17): Int::fmt_prec has cyclomatic complexity 17 (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. This is NOT this file\u0027s highest cyclomatic complexity: pyrefly_types::dimension::compare_int (cyclomatic 19) 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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9732c2e3c7315b86ca4ce4e3d95ff5a57e2a3bfcde43dc4687de47927e43b8"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::dimension::canonicalize_product (cyclomatic 17): pyrefly_types::dimension::canonicalize_product 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. This is NOT this file\u0027s highest cyclomatic complexity: pyrefly_types::dimension::compare_int (cyclomatic 19) 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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":780}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c45d143ef531d32348616104cd9faa6c03060091f11cb6530f51822d5bad8fa"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::infer_call (cyclomatic 17): pyrefly_types::meta_shape_dsl::infer_call 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1938}}}],"partialFingerprints":{"codehealthFindingId/v1":"eda494c0972123ea2b8b92d2e4946b293060aa165ee82dbeb6040011601a911b"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::type_level_dsl::lower_parameter (cyclomatic 17): pyrefly_types::type_level_dsl::lower_parameter has cyclomatic complexity 17 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":8322}}}],"partialFingerprints":{"codehealthFindingId/v1":"37c79b2f02865c0f61cc9b878cc56cefcd8b12aacb50089197225b7677f5af68"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::type_level_dsl::evaluate_dimension_arithmetic (cyclomatic 17): pyrefly_types::type_level_dsl::evaluate_dimension_arithmetic has cyclomatic complexity 17 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 5 belong to one function item inside it that branches. 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":8376}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd324f5c8e87ab2451d4798c2e0116d98833db912742388e0bc22eb9006f5fa"}},{"ruleId":"D1","level":"warning","message":{"text":"UpwardSearch::directory_absolute (cyclomatic 17): UpwardSearch::directory_absolute 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":"crates/pyrefly_util/src/upward_search.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"3874234bd4f3eb541cc1467bdd496fde7d7e323d6fc463a9570e482da3b12ded"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::polars_group_by_agg (cyclomatic 17): AnswersSolver::polars_group_by_agg 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2842}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c25fd699bb1f8ef02abecd3fcb635b0b74f30e352e87429c75b1a7927ec2f83"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::tvars_to_tparams_for_type_alias (cyclomatic 17): AnswersSolver::tvars_to_tparams_for_type_alias has cyclomatic complexity 17 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1313}}}],"partialFingerprints":{"codehealthFindingId/v1":"56a6dd61dbe397ce8d4c8e5f6be5abc918e5ca8d056c4dc5690b8d32b1c7af16"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::check_except_clause_reachability (cyclomatic 17): AnswersSolver::check_except_clause_reachability 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4458}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c36b37d30e6f4a118e114cf48f9c03580b4a448162cecd5faeb7449beea4bfc"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::as_class_info::f (cyclomatic 17): AnswersSolver::as_class_info::f has cyclomatic complexity 17 (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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":789}}}],"partialFingerprints":{"codehealthFindingId/v1":"34a47404daa8a780217a6e6dbd8a7841c7fde80586c162366c5f69710f3006d1"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::parse_type_shape_dsl_argument (cyclomatic 17): AnswersSolver::parse_type_shape_dsl_argument 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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":1153}}}],"partialFingerprints":{"codehealthFindingId/v1":"effa9c6f2507f54c691d3737a04964170d36cc30f8f541b704631b3f2d73b564"}},{"ruleId":"D1","level":"warning","message":{"text":"CallArg::pre_eval (cyclomatic 17): CallArg::pre_eval 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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"efd348f5be9ecfb5d2ae4ba8139ed334305071217797b6a4a5e4f57b050fc252"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::stmts (cyclomatic 17): BindingsBuilder::stmts 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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":1321}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e8eff8cb370af9391723b90e82be57243bcbd309d81666166cfa40a1fa4631"}},{"ruleId":"D1","level":"warning","message":{"text":"Server::publish_for_handles (cyclomatic 17): Server::publish_for_handles 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":3393}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3e49b989d9ef81aab47781858f5d65a5285f85ec1f22a11fa0b1f783b1aa710"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::extend_dict_key_suggestions (cyclomatic 17): Transaction::extend_dict_key_suggestions 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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"d910d22ee8b33e552ae3a755eb8da1a19935e7a1f1fdfe2ecca01908e7a6df72"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::state::semantic_tokens::collect_disabled_ranges_from_stmt (cyclomatic 17): pyrefly::lib::state::semantic_tokens::collect_disabled_ranges_from_stmt has cyclomatic complexity 17 (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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc23b122a664c866e5ef712839c1d89985c56c5847dfd4f51d0cf574e109ca44"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::move_module::build_module_member_consumer_import_updates (cyclomatic 17): pyrefly::lib::state::lsp::quick_fixes::move_module::build_module_member_consumer_import_updates 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":"pyrefly/lib/state/lsp/quick_fixes/move_module.rs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"7146993d2a2b69addb365bc7b8a6bbe17f8ae5b686c8549eac59b6a14267c083"}},{"ruleId":"D1","level":"warning","message":{"text":"generate_protocol.replace_flag_enum (cyclomatic 17): generate_protocol.replace_flag_enum 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":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":568}}}],"partialFingerprints":{"codehealthFindingId/v1":"51cb7fefd348222fa2465653737501c5dd477cf808279d30f825eeaddaad81c7"}},{"ruleId":"D1","level":"warning","message":{"text":"github_issues.fetch_issues (cyclomatic 17): github_issues.fetch_issues 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":"scripts/issue_ranker/github_issues.py"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4cf5980aab74c48c0776610b4ff7e7c2d15839a4510f7c88f7577569c55aff2"}},{"ruleId":"D1","level":"warning","message":{"text":"IgnoreMissingImports::migrate_from_mypy (cyclomatic 16): IgnoreMissingImports::migrate_from_mypy 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":"crates/pyrefly_config/src/migration/ignore_missing_imports.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0f19e4e25c7580bd6dbbb9ee6abbe14cd4d7bf7c8fc9eb16f39f49f5582d71"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_python::docstring::parse_google_params (cyclomatic 16): pyrefly_python::docstring::parse_google_params 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":"crates/pyrefly_python/src/docstring.rs"},"region":{"startLine":525}}}],"partialFingerprints":{"codehealthFindingId/v1":"adcbad9f54189bd90cae1326a96d128ce62b649540db879a68695e30da02a6b0"}},{"ruleId":"D1","level":"warning","message":{"text":"ResolvedTypeShapeDslProgram::evaluate_suite (cyclomatic 16): ResolvedTypeShapeDslProgram::evaluate_suite has cyclomatic complexity 16 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6253}}}],"partialFingerprints":{"codehealthFindingId/v1":"03418a83b43ed5b7f3b72717b1d2f2df39b18a080445d1c4f89a81431cd88151"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_flag_slot (cyclomatic 16): DslValidator::validate_flag_slot has cyclomatic complexity 16 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2708}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcd052dd90d3c293dca72b13f7dfd45282ab9e59d0be7e9b49b353f7011565cc"}},{"ruleId":"D1","level":"warning","message":{"text":"DslValidator::validate_int_tuple_expression (cyclomatic 16): DslValidator::validate_int_tuple_expression has cyclomatic complexity 16 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3829}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdbaafc1ddb3f27499a7e9ae175394a2ad158bcf4fd05f6d4bc6359c04b070a8"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::literal::write_escaped_string (cyclomatic 16): pyrefly_types::literal::write_escaped_string has cyclomatic complexity 16 (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":"crates/pyrefly_types/src/literal.rs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"11851130b1409a187070fad0dc98fd1ff2a18da6965f2ad728093d021576d070"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly_types::einsum::parse_einsum_equation (cyclomatic 16): pyrefly_types::einsum::parse_einsum_equation 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":"crates/pyrefly_types/src/einsum.rs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a471b1b92570b50ad07a14e5b2905bc23ad411d942ac9bbcf29592283253668"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::check_dict_items_against_typed_dict (cyclomatic 16): AnswersSolver::check_dict_items_against_typed_dict 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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"80cf29ed6eb72f239d9c9beb00ff98f3973411083d71163de739cc9b4555d7c6"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::augassign_infer (cyclomatic 16): AnswersSolver::augassign_infer 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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7b110ca16de98d23206d3798927d56c99694583017bf506b0f2b9284031cdf"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::compare_types (cyclomatic 16): AnswersSolver::compare_types 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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"c516030d06f8094d9cae0bb9d48ea106e35535e54e714eb3a35114f1720122d1"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::polars_nested_dtype_from_call (cyclomatic 16): AnswersSolver::polars_nested_dtype_from_call 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"083c9cf915e00a0e20253634eef9b587616017c096f34a6a9d318d3965dde0b3"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::infer_dataframe_dict_schema (cyclomatic 16): AnswersSolver::infer_dataframe_dict_schema 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1823}}}],"partialFingerprints":{"codehealthFindingId/v1":"1894566a1ae00fda03cc2e11de8487819f6e713cd564f982c54e5391b4990233"}},{"ruleId":"D1","level":"warning","message":{"text":"AnswersSolver::validated_tparams (cyclomatic 16): AnswersSolver::validated_tparams 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":2212}}}],"partialFingerprints":{"codehealthFindingId/v1":"355660f8ddf1f16163731b58360f7cb152de7ccf83f5328abe26146846a34878"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::extract_django_fields_from_class_body (cyclomatic 16): BindingsBuilder::extract_django_fields_from_class_body 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":"pyrefly/lib/binding/django.rs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2015a0f9ad33e53a1dab712d60ab46afe28af98d6dc95112108f49562c82451"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::merge_flow (cyclomatic 16): BindingsBuilder::merge_flow has cyclomatic complexity 16 (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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":4118}}}],"partialFingerprints":{"codehealthFindingId/v1":"d11c5b53ca883f4bda540dc6c43124c92bf11120e0f1def941a0193d922f2412"}},{"ruleId":"D1","level":"warning","message":{"text":"BindingsBuilder::typealiastype_from_call (cyclomatic 16): BindingsBuilder::typealiastype_from_call 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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea30de43ce81c9d61f512a1ee4243780059148ff5d1386038b9c955964149347"}},{"ruleId":"D1","level":"warning","message":{"text":"InferArgs::run_inner (cyclomatic 16): InferArgs::run_inner 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":"pyrefly/lib/commands/infer.rs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"03c5e1e4418bdada9c2052e9b190561a9f9bbb5ba18fb14264d9b3915e90feec"}},{"ruleId":"D1","level":"warning","message":{"text":"ContextualTypeCollector::visit_stmt (cyclomatic 16): ContextualTypeCollector::visit_stmt 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":"pyrefly/lib/report/cinderx/collect.rs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"aed0e25ba487265f90deeec3e6c2f00385bca176e83f490c0d02075ceadf1785"}},{"ruleId":"D1","level":"warning","message":{"text":"SemanticTokenBuilder::process_expr (cyclomatic 16): SemanticTokenBuilder::process_expr has cyclomatic complexity 16 (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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0d3a6a0240582171038ac2527ba4e3330a456c478fdd219597800a4f021e140"}},{"ruleId":"D1","level":"warning","message":{"text":"ModuleChanges::overlaps (cyclomatic 16): ModuleChanges::overlaps 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":"pyrefly/lib/state/state.rs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"79852281114443e013ce1c9eba56adf63b588a6218bd7f33abca21f1a8e0c9e7"}},{"ruleId":"D1","level":"warning","message":{"text":"Transaction::find_definition_for_attribute_in_non_python_module (cyclomatic 16): Transaction::find_definition_for_attribute_in_non_python_module 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":"pyrefly/lib/state/lsp/extra_extensions.rs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"379a1d363b8b1c53486595ffc77f54075627fa09ece239d6a793b59d9af14f37"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::parse_instance_attrs (cyclomatic 16): pyrefly::lib::commands::coverage::collect::parse_instance_attrs 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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"98afc63c4b35314990b07681a58b487674dabe3a9cde95127955e1e2ddc0c862"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::lsp::non_wasm::document_symbols::recurse_stmt_adding_symbols (cyclomatic 16): pyrefly::lib::lsp::non_wasm::document_symbols::recurse_stmt_adding_symbols 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":"pyrefly/lib/lsp/non_wasm/document_symbols.rs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"951fb60dca07fd5a85faa50ec531d7d8f436ccf1729cce8d837114f82216612f"}},{"ruleId":"D1","level":"warning","message":{"text":"pyrefly::lib::lsp::wasm::hover::get_hover_with_verbosity (cyclomatic 16): pyrefly::lib::lsp::wasm::hover::get_hover_with_verbosity 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":"pyrefly/lib/lsp/wasm/hover.rs"},"region":{"startLine":930}}}],"partialFingerprints":{"codehealthFindingId/v1":"a14434887926ab7896d26a50084c25a34b6d8cacf443a3424d3ab49af1a68d96"}},{"ruleId":"D1","level":"warning","message":{"text":"conformance_output.main (cyclomatic 16): conformance_output.main 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":"conformance/conformance_output.py"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"744186ef61e90ad501dc6df2c0cb326c0de4b8bb1d6b85c9ec14a7520db2ebce"}},{"ruleId":"D1","level":"warning","message":{"text":"github_utils.load_env_file (cyclomatic 16): github_utils.load_env_file 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":"scripts/github_utils.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab0502c4ba0e44c7c65226976eb672fdf76e3d1e988295caf3642684b0614ff3"}},{"ruleId":"D1","level":"warning","message":{"text":"issue_checker._run_all_checkers (cyclomatic 16): issue_checker._run_all_checkers 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":"scripts/issue_ranker/issue_checker.py"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"2acb05654e88d952633a0c772c2567691e22ae890456998466ea31842bf0cd3a"}},{"ruleId":"D1","level":"warning","message":{"text":"rank.rank_issues (cyclomatic 16): rank.rank_issues has cyclomatic complexity 16 (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":"scripts/issue_ranker/passes/rank.py"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf13c8c92042a400bc03cd2d5946609ccd56ea36687641c1f732c9118b1f2f91"}},{"ruleId":"D1","level":"warning","message":{"text":"classifier._format_errors_for_llm (cyclomatic 16): classifier._format_errors_for_llm 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":"scripts/primer_classifier/classifier.py"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"05aa20ca482a21f4b114ba14319d8331b4a09c27fca4deaeee263fd6ae61aa36"}},{"ruleId":"D1","level":"warning","message":{"text":"classifier._enforce_cross_project_consistency (cyclomatic 16): classifier._enforce_cross_project_consistency 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":"scripts/primer_classifier/classifier.py"},"region":{"startLine":736}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4c39d4ead63deab2a6d68b859f40bd77ebf0cc1bb932e0442226be4999ae06e"}},{"ruleId":"D1","level":"warning","message":{"text":"formatter._build_high_level_summary (cyclomatic 16): formatter._build_high_level_summary 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":"scripts/primer_classifier/formatter.py"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0e25a397cc25b3ca7b588537a5c82a6d56809ed90e3eca815181e3c916b16bc"}},{"ruleId":"D1","level":"warning","message":{"text":"llm_client._parse_classification (cyclomatic 16): llm_client._parse_classification 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":"scripts/primer_classifier/llm_client.py"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1e3251130c4250892f955f4b8699f5aa04497bf15375ebfe74f85fab670e6db"}},{"ruleId":"D1","level":"warning","message":{"text":"parser.parse_primer_diff (cyclomatic 16): parser.parse_primer_diff 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":"scripts/primer_classifier/parser.py"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f8b90a2717115877757601bb35762df035fbce3add9183afa8fe22eef1704a3"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::callable_infer_params (cognitive 340): AnswersSolver::callable_infer_params has cognitive complexity 340 (threshold 15). Drivers by points: if/else 87 (227 pts), match/switch 23 (71 pts), loops 14 (28 pts), boolean chains 14 (nesting depth added 202). Of this number, 339 points are the body\u0027s own statements and 1 belongs 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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"2295af03dd8ef0e2ef3176db40eb96e0f9bf8a69911a949d44c4558672bf1fbe"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::stmt_impl (cognitive 322): BindingsBuilder::stmt_impl has cognitive complexity 322 (threshold 15). Drivers by points: if/else 99 (242 pts), match/switch 14 (42 pts), boolean chains 20, loops 8 (18 pts) (nesting depth added 181). 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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":847}}}],"partialFingerprints":{"codehealthFindingId/v1":"4800390511b2c07f375a08e62568905868d408e5236468238a686fa03cbf5ca7"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::process_event (cognitive 263): Server::process_event has cognitive complexity 263 (threshold 15). Drivers by points: if/else 84 (170 pts), match/switch 21 (81 pts), boolean chains 9, loops 1 (3 pts) (nesting depth added 148). 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":2054}}}],"partialFingerprints":{"codehealthFindingId/v1":"b36df6b5664a25868ce2cda1d42261b6fcb6aab8e3da2dbd3d08facf465495db"}},{"ruleId":"D2","level":"warning","message":{"text":"StructurallyValidatedTypeShapeDslFunction::evaluate_expression (cognitive 250): StructurallyValidatedTypeShapeDslFunction::evaluate_expression has cognitive complexity 250 (threshold 15). Drivers by points: match/switch 60 (127 pts), if/else 53 (108 pts), loops 5 (10 pts), boolean chains 5 (nesting depth added 127). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6770}}}],"partialFingerprints":{"codehealthFindingId/v1":"34a136eb784cc9b019c535a096227ac9017d18716ba66c461db67f9442fa2af6"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeDisplayContext::fmt_helper_generic (cognitive 212): TypeDisplayContext::fmt_helper_generic has cognitive complexity 212 (threshold 15). Drivers by points: if/else 60 (146 pts), match/switch 16 (31 pts), loops 8 (22 pts), boolean chains 13 (nesting depth added 115). 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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"744a80103c7018016d6941209458e37f1d3dd8a1b6901d405f8de94168776ae5"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::calculate_class_field (cognitive 200): AnswersSolver::calculate_class_field has cognitive complexity 200 (threshold 15). Drivers by points: if/else 75 (137 pts), boolean chains 35, match/switch 9 (19 pts), loops 3 (9 pts) (nesting depth added 78). 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1524}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4833d0e41735a7533712475d0073d5820dc8d5a0a4ed1754a1c745bd4eab7f"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::atomic_narrow (cognitive 166): AnswersSolver::atomic_narrow has cognitive complexity 166 (threshold 15). Drivers by points: if/else 59 (126 pts), match/switch 7 (20 pts), loops 4 (12 pts), boolean chains 8 (nesting depth added 88). 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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1352}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bf0e077af2c48a32d2c8fed8acd8dbdb5ea80d7283e73d8a0a9eca666be25fd"}},{"ruleId":"D2","level":"warning","message":{"text":"DefinitionsBuilder::stmt (cognitive 163): DefinitionsBuilder::stmt has cognitive complexity 163 (threshold 15). Drivers by points: if/else 35 (87 pts), match/switch 13 (38 pts), loops 13 (28 pts), boolean chains 10 (nesting depth added 92). 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":"pyrefly/lib/export/definitions.rs"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a3156f8890c97c34769986aa41f91d7fc6791fe09732f524a48c66d881322d3"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::bind_pattern (cognitive 151): BindingsBuilder::bind_pattern has cognitive complexity 151 (threshold 15). Drivers by points: if/else 49 (96 pts), match/switch 7 (24 pts), boolean chains 23, loops 4 (8 pts) (nesting depth added 68). 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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"dada20ad98f081741de3dcfd994fff15b9ebd5ad83ec8730b8a73d7751ca8b8d"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::ensure_expr (cognitive 144): BindingsBuilder::ensure_expr has cognitive complexity 144 (threshold 15). Drivers by points: if/else 32 (73 pts), loops 14 (45 pts), match/switch 8 (16 pts), boolean chains 10 (nesting depth added 80). Of this number, 142 points are the body\u0027s own statements and 2 belong to one function item inside it that branches. 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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e9a288e005365acbadbe3d698c1a41f3cb0a1fb971f82b245f557cd95b90825"}},{"ruleId":"D2","level":"warning","message":{"text":"StructurallyValidatedTypeShapeDslFunction::evaluate_condition (cognitive 130): StructurallyValidatedTypeShapeDslFunction::evaluate_condition has cognitive complexity 130 (threshold 15). Drivers by points: if/else 41 (78 pts), match/switch 21 (48 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 65). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7795}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9a698e7ccbc6d3537745bb1d2667f576af70a19aa3b760ca33c7fc4bd64e48e"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::is_subset_eq_no_recursive_check (cognitive 127): Subset::is_subset_eq_no_recursive_check has cognitive complexity 127 (threshold 15). Drivers by points: if/else 37 (60 pts), boolean chains 44, match/switch 10 (21 pts), loops 1 (2 pts) (nesting depth added 35). 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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1877}}}],"partialFingerprints":{"codehealthFindingId/v1":"23bdb33d53f85deec6fa02d7ae2baae6e8bfcfc6afc238ccfc805763024d7291"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::as_call_target_impl (cognitive 118): AnswersSolver::as_call_target_impl has cognitive complexity 118 (threshold 15). Drivers by points: if/else 32 (71 pts), match/switch 17 (38 pts), loops 3 (9 pts) (nesting depth added 66). 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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0e6fff6e4d2bbea18daf60f4f6c6962fa00a3999c0261ecc73d866ad1a0201e"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::lookup_attr_static1 (cognitive 113): AnswersSolver::lookup_attr_static1 has cognitive complexity 113 (threshold 15). Drivers by points: if/else 29 (55 pts), match/switch 17 (40 pts), loops 4 (10 pts), boolean chains 8 (nesting depth added 55). 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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":1737}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a30328ce55f045f8eb6efe013a9fbdc56df133634cae2e70b753ad85c504745"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_consistent_override_for_field (cognitive 109): AnswersSolver::check_consistent_override_for_field has cognitive complexity 109 (threshold 15). Drivers by points: if/else 39 (73 pts), boolean chains 22, match/switch 5 (10 pts), loops 2 (4 pts) (nesting depth added 41). 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":4060}}}],"partialFingerprints":{"codehealthFindingId/v1":"2baf53eae650d655bf047e88a15c2f00599b8f5df4241a6eae784f701127addf"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::validate_type_shape_dsl_declaration (cognitive 108): AnswersSolver::validate_type_shape_dsl_declaration has cognitive complexity 108 (threshold 15). Drivers by points: match/switch 15 (49 pts), if/else 22 (42 pts), boolean chains 10, loops 4 (7 pts) (nesting depth added 57). 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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"f64d9f168c79598adfd5b90294474ea2dabb6dd9f1a1f0c2a0dc88e814055121"}},{"ruleId":"D2","level":"warning","message":{"text":"DslValidator::validate_condition (cognitive 107): DslValidator::validate_condition has cognitive complexity 107 (threshold 15). Drivers by points: if/else 35 (58 pts), boolean chains 22, match/switch 12 (21 pts), loops 2 (6 pts) (nesting depth added 36). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":4461}}}],"partialFingerprints":{"codehealthFindingId/v1":"b986bc91bb8eddc35c7307c8905a215af2ff74cc8d019f0f6d88fef2b51eec99"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::subscript_str_literal (cognitive 103): AnswersSolver::subscript_str_literal has cognitive complexity 103 (threshold 15). Drivers by points: if/else 37 (77 pts), match/switch 9 (21 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 53). 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":"pyrefly/lib/alt/subscript.rs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc7fd6bc7c3b936c453249424eaa366e99b208452e5425be4db5c975c5464022"}},{"ruleId":"D2","level":"warning","message":{"text":"primer_impact.compute_primer_impact (cognitive 102): primer_impact.compute_primer_impact has cognitive complexity 102 (threshold 15). Drivers by points: if/else 20 (66 pts), loops 8 (31 pts), boolean chains 5 (nesting depth added 69). 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":"scripts/issue_ranker/passes/primer_impact.py"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"785a71f17ea79c79ed4ddb9b763544d3d7497c945144aceb6d460681b0190744"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::code_action (cognitive 96): Server::code_action has cognitive complexity 96 (threshold 15). Drivers by points: if/else 35 (84 pts), loops 4 (11 pts), boolean chains 1 (nesting depth added 56). 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4964}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceeea17a163baa6e6a4dcd21de745e1f3cc24c57e8fd952303d228d43469647a"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::completion_sorted_opt_with_incomplete (cognitive 95): Transaction::completion_sorted_opt_with_incomplete has cognitive complexity 95 (threshold 15). Drivers by points: if/else 27 (69 pts), boolean chains 13, loops 3 (8 pts), match/switch 2 (5 pts) (nesting depth added 50). 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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":1068}}}],"partialFingerprints":{"codehealthFindingId/v1":"35a40e31f1f0da745d484c452a9b6e671dbd92e837542219ea953031863c0344"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::inlay_hints (cognitive 95): Transaction::inlay_hints has cognitive complexity 95 (threshold 15). Drivers by points: if/else 22 (55 pts), match/switch 8 (22 pts), boolean chains 15, loops 2 (3 pts) (nesting depth added 48). 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":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"e93855b55e9dd99ad7551a11d08b6c6d4eb66f46074790623f992ccaffec6ef0"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::is_subset_eq_var (cognitive 94): Subset::is_subset_eq_var has cognitive complexity 94 (threshold 15). Drivers by points: if/else 31 (68 pts), match/switch 9 (21 pts), boolean chains 5 (nesting depth added 49). 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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3727}}}],"partialFingerprints":{"codehealthFindingId/v1":"f36fcadc7d0f61b8f07ee4618e9ac24cb67647e921aa2f941140ff4edc5552c8"}},{"ruleId":"D2","level":"warning","message":{"text":"DslValidator::validate_return (cognitive 92): DslValidator::validate_return has cognitive complexity 92 (threshold 15). Drivers by points: if/else 21 (67 pts), match/switch 6 (20 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 62). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":4946}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f5c148f5b3b73f8ceea5c3c6f483986c4f4ef7fc435f59024b414b45f06a5d3"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::subscript_infer_for_type_with_key_present_inner (cognitive 91): AnswersSolver::subscript_infer_for_type_with_key_present_inner has cognitive complexity 91 (threshold 15). Drivers by points: if/else 30 (56 pts), match/switch 12 (23 pts), boolean chains 12 (nesting depth added 37). 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3367}}}],"partialFingerprints":{"codehealthFindingId/v1":"519571b88cc8a10733aca8acba5b303e4f834f0d993b544261df6d2358dd42df"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::is_subset_param_list_impl (cognitive 91): Subset::is_subset_param_list_impl has cognitive complexity 91 (threshold 15). Drivers by points: if/else 27 (51 pts), loops 12 (20 pts), match/switch 6 (15 pts), boolean chains 5 (nesting depth added 41). 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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"64868e8fa9250bc4d1e0dda4af2a52eb3e39724dd6192f6dd18ce463437f26a1"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::error::suppress::remove_unused_ignores_from_serialized (cognitive 91): pyrefly::lib::error::suppress::remove_unused_ignores_from_serialized has cognitive complexity 91 (threshold 15). Drivers by points: if/else 17 (74 pts), loops 5 (12 pts), boolean chains 5 (nesting depth added 64). 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":"pyrefly/lib/error/suppress.rs"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"212f211fb5170bf4dd6ea3e42a66d22777e7e94609d977e035595d02d528c963"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::parse_functions (cognitive 90): pyrefly::lib::commands::coverage::collect::parse_functions has cognitive complexity 90 (threshold 15). Drivers by points: if/else 25 (67 pts), boolean chains 11, match/switch 2 (7 pts), loops 3 (5 pts) (nesting depth added 49). 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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"edcfd06a124edbd6a7c00f5f1ccbad2b8780e4c5c5c6ab44955d363fd4c7065a"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::call_functools_partial (cognitive 87): AnswersSolver::call_functools_partial has cognitive complexity 87 (threshold 15). Drivers by points: if/else 28 (49 pts), match/switch 12 (24 pts), loops 4 (11 pts), boolean chains 3 (nesting depth added 40). 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":"pyrefly/lib/alt/functools.rs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b3d95984f06684f82e97a71c80f2cf64a8db542f832f016710d005cebf71dd6"}},{"ruleId":"D2","level":"warning","message":{"text":"CheckArgs::finish_cli_run (cognitive 87): CheckArgs::finish_cli_run has cognitive complexity 87 (threshold 15). Drivers by points: if/else 50 (66 pts), loops 4 (8 pts), match/switch 2 (7 pts), boolean chains 6 (nesting depth added 25). 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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":1893}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f07d82b79aedd4533963ff644e21a04639abae40e7545062393c0b38aa9220"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::local_quickfix_code_actions_sorted (cognitive 84): Transaction::local_quickfix_code_actions_sorted has cognitive complexity 84 (threshold 15). Drivers by points: if/else 20 (62 pts), loops 6 (12 pts), boolean chains 8, match/switch 1 (2 pts) (nesting depth added 49). 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":3328}}}],"partialFingerprints":{"codehealthFindingId/v1":"f78d4a382c13d9a85a3a73667fee9fcc59ed43f7e36be8371e1d848850e41548"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_type_is_class_object (cognitive 82): AnswersSolver::check_type_is_class_object has cognitive complexity 82 (threshold 15). Drivers by points: if/else 18 (62 pts), loops 3 (14 pts), boolean chains 6 (nesting depth added 55). 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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca0cc202c67eb6d7ea86882d0b08f01f5fe127207a6576f8ff369346e666c9d"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::expr_infer_impl_helper (cognitive 77): AnswersSolver::expr_infer_impl_helper has cognitive complexity 77 (threshold 15). Drivers by points: if/else 29 (49 pts), match/switch 13 (26 pts), boolean chains 2 (nesting depth added 33). 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc8729ab31bffd9d6cd42a49d7c52cd7c0a5108b352f71b7bdaf31b3b255dcc9"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::eval_dsl_expr (cognitive 76): pyrefly_types::meta_shape_dsl::eval_dsl_expr has cognitive complexity 76 (threshold 15). Drivers by points: if/else 18 (40 pts), match/switch 12 (28 pts), loops 2 (6 pts), boolean chains 2 (nesting depth added 42). 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2373}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e873cf586a9054dca434de4daacd040892732ad0fb6897816ccd18b32620b73"}},{"ruleId":"D2","level":"warning","message":{"text":"Errors::collect_unused_ignore_errors (cognitive 75): Errors::collect_unused_ignore_errors has cognitive complexity 75 (threshold 15). Drivers by points: if/else 15 (49 pts), loops 7 (18 pts), boolean chains 4, match/switch 1 (4 pts) (nesting depth added 48). 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":"pyrefly/lib/state/errors.rs"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"e719434f226bbef0e8405179fb346011ebed6478b7a5d695031f22ba7262f169"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::binding::attrs::collect_attrs_decorator_methods (cognitive 75): pyrefly::lib::binding::attrs::collect_attrs_decorator_methods has cognitive complexity 75 (threshold 15). Drivers by points: if/else 18 (54 pts), loops 5 (13 pts), match/switch 2 (6 pts), boolean chains 2 (nesting depth added 48). 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":"pyrefly/lib/binding/attrs.rs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69f43c839685d23a1bbb2d39f1b125a7f60ba8dc44e46563e6f0b7f7fa75198"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::tuple_infer (cognitive 71): AnswersSolver::tuple_infer has cognitive complexity 71 (threshold 15). Drivers by points: if/else 20 (46 pts), loops 6 (17 pts), match/switch 3 (7 pts), boolean chains 1 (nesting depth added 41). 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1602}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a732a3d4beb85088d8e6a4d74eee0da4f225a0f7bfaf0da13695a77339316e7"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_shape_flag_constructor_sources (cognitive 71): AnswersSolver::check_shape_flag_constructor_sources has cognitive complexity 71 (threshold 15). Drivers by points: if/else 12 (36 pts), loops 6 (17 pts), match/switch 5 (17 pts), boolean chains 1 (nesting depth added 47). 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":"pyrefly/lib/alt/shape_flag.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab9c203627cef98b4b38e61011e28c1c4b6242d5e442612d305b73db58861db2"}},{"ruleId":"D2","level":"warning","message":{"text":"SemanticTokenBuilder::process_stmt (cognitive 71): SemanticTokenBuilder::process_stmt has cognitive complexity 71 (threshold 15). Drivers by points: if/else 19 (49 pts), loops 9 (21 pts), match/switch 1 (nesting depth added 42). 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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7c520f0aabacc9ef6d607e2e98de62b370e9d97ddafed7f4cd712ecc9ada169"}},{"ruleId":"D2","level":"warning","message":{"text":"Solver::finish_quantified_with_captures (cognitive 70): Solver::finish_quantified_with_captures has cognitive complexity 70 (threshold 15). Drivers by points: if/else 22 (46 pts), match/switch 5 (10 pts), loops 6 (9 pts), boolean chains 5 (nesting depth added 32). 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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":2103}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb31a5a700958d0cc07166a5d8a3b5c25f9b5c169f3f2de94b42afc59d8e815f"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::dict_items_infer_inner (cognitive 69): AnswersSolver::dict_items_infer_inner has cognitive complexity 69 (threshold 15). Drivers by points: if/else 20 (52 pts), boolean chains 11, loops 1 (4 pts), match/switch 1 (2 pts) (nesting depth added 36). 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1885}}}],"partialFingerprints":{"codehealthFindingId/v1":"15039e64700a9ee10d2877795b359611c958ae70a91595578adfd54b992de70f"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::find_definition (cognitive 69): Transaction::find_definition has cognitive complexity 69 (threshold 15). Drivers by points: if/else 22 (45 pts), match/switch 8 (19 pts), boolean chains 5 (nesting depth added 34). 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2676}}}],"partialFingerprints":{"codehealthFindingId/v1":"20f665939717398585771323490ffcd80cd41b41a311f7b99412a22cead48a7e"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfigFile::configure_at (cognitive 66): ConfigFile::configure_at has cognitive complexity 66 (threshold 15). Drivers by points: if/else 46 (52 pts), match/switch 6 (8 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 9). 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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1578}}}],"partialFingerprints":{"codehealthFindingId/v1":"a18fb1e3eda2f038c4f4efd4f110e3cf4b390858668d04d91a0546ce6f23f651"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::as_attribute_base1 (cognitive 66): AnswersSolver::as_attribute_base1 has cognitive complexity 66 (threshold 15). Drivers by points: if/else 15 (37 pts), loops 8 (25 pts), match/switch 2 (3 pts), boolean chains 1 (nesting depth added 40). 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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2530}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b775c8d629717916442d00b0bc0541ac775b6ac036aaef2cb963045a3d9a948"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::narrow (cognitive 66): AnswersSolver::narrow has cognitive complexity 66 (threshold 15). Drivers by points: if/else 19 (37 pts), match/switch 10 (21 pts), boolean chains 5, loops 1 (3 pts) (nesting depth added 31). 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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":2031}}}],"partialFingerprints":{"codehealthFindingId/v1":"1681ca5ac29647f40983a35abfd2e81e42561f850c27d8fb7c0d491fe30c2f87"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::find_closest_overload (cognitive 66): AnswersSolver::find_closest_overload has cognitive complexity 66 (threshold 15). Drivers by points: if/else 24 (55 pts), match/switch 2 (6 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 37). 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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"dded9f5e2156a04972ea4e75724fdd04c463c2898b346175cefa5e27925c9fc6"}},{"ruleId":"D2","level":"warning","message":{"text":"NarrowOps::from_expr_helper (cognitive 63): NarrowOps::from_expr_helper has cognitive complexity 63 (threshold 15). Drivers by points: if/else 13 (27 pts), loops 5 (14 pts), match/switch 6 (13 pts), boolean chains 9 (nesting depth added 30). 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":"pyrefly/lib/binding/narrow.rs"},"region":{"startLine":889}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cac261d640f87a68511590cb17fa0e4398828dde7939a6608653f66d417c788"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_build::module_resolver::find_one_part_prefix (cognitive 62): pyrefly_build::module_resolver::find_one_part_prefix has cognitive complexity 62 (threshold 15). Drivers by points: if/else 11 (43 pts), loops 4 (11 pts), match/switch 1 (6 pts), boolean chains 2 (nesting depth added 44). 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":"crates/pyrefly_build/src/module_resolver.rs"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"692a441685319aba751430a6e8a6523c144619768cae6e36479c5112f73664df"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::solve_expectation (cognitive 62): AnswersSolver::solve_expectation has cognitive complexity 62 (threshold 15). Drivers by points: if/else 13 (30 pts), match/switch 7 (18 pts), boolean chains 10, loops 2 (4 pts) (nesting depth added 30). Of this number, 56 points are the body\u0027s own statements and 6 belong to one function item inside it that branches. 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":2579}}}],"partialFingerprints":{"codehealthFindingId/v1":"56f887c4b6ff45aeec8013c4539a507edb37df1c6a4736e7d70567d28f9dbe74"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::shape_index::lower_index_type_in_position (cognitive 59): pyrefly_types::shape_index::lower_index_type_in_position has cognitive complexity 59 (threshold 15). Drivers by points: match/switch 10 (25 pts), if/else 15 (24 pts), loops 2 (6 pts), boolean chains 4 (nesting depth added 28). 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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"578150d3ffe8605749b24ed9c5904d811640439f3ea42067e42cd6cfe519bd3b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::as_attribute_base1_of_type (cognitive 58): AnswersSolver::as_attribute_base1_of_type has cognitive complexity 58 (threshold 15). Drivers by points: if/else 10 (29 pts), loops 7 (24 pts), match/switch 3 (5 pts) (nesting depth added 38). 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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2814}}}],"partialFingerprints":{"codehealthFindingId/v1":"e72162cd7f95d68a8b9756c27398757ff5e6e103c6894567f91523d659e71ca7"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::class_metadata_of (cognitive 58): AnswersSolver::class_metadata_of has cognitive complexity 58 (threshold 15). Drivers by points: if/else 22 (30 pts), boolean chains 16, match/switch 3 (7 pts), loops 4 (5 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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d8b8a68e7bee6b6145496f3c54201c5ac7cee78f14198d59e3e44d5391ad61a"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_consistent_multiple_inheritance (cognitive 57): AnswersSolver::check_consistent_multiple_inheritance has cognitive complexity 57 (threshold 15). Drivers by points: if/else 12 (38 pts), loops 6 (16 pts), boolean chains 3 (nesting depth added 36). 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":4523}}}],"partialFingerprints":{"codehealthFindingId/v1":"3be7549372e8d5d78569115d922d04a8007efdcd3d68c205e7e1d0fe1ceef511"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::binding_to_type_unpacked_value (cognitive 56): AnswersSolver::binding_to_type_unpacked_value has cognitive complexity 56 (threshold 15). Drivers by points: if/else 15 (32 pts), match/switch 7 (20 pts), boolean chains 3, loops 1 (nesting depth added 30). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4820}}}],"partialFingerprints":{"codehealthFindingId/v1":"7735045a10e44310c25cd40ceff8ce5ff6dbf0a72758f607d720eb4a29564fef"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::demand (cognitive 56): Transaction::demand has cognitive complexity 56 (threshold 15). Drivers by points: if/else 22 (42 pts), boolean chains 6, loops 2 (4 pts), match/switch 2 (4 pts) (nesting depth added 24). 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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1457}}}],"partialFingerprints":{"codehealthFindingId/v1":"4304dfb1738fcf1c9ea01c0b87bf823bfc3cf0708f01f9a8630ccfcc360d4808"}},{"ruleId":"D2","level":"warning","message":{"text":"SideParser::parse (cognitive 55): SideParser::parse has cognitive complexity 55 (threshold 15). Drivers by points: if/else 14 (38 pts), loops 4 (14 pts), boolean chains 3 (nesting depth added 34). 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":"crates/pyrefly_types/src/gufunc.rs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"051dd05f101aca158ff6ef1aa3f5a77c643aeb2f105c9000de78ce3771f59f8e"}},{"ruleId":"D2","level":"warning","message":{"text":"stub_coverage._literal_all (cognitive 55): stub_coverage._literal_all has cognitive complexity 55 (threshold 15). Drivers by points: if/else 17 (46 pts), boolean chains 5, ternaries 2 (3 pts), loops 1 (nesting depth added 30). 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":"tensor-shapes/stub_coverage.py"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"475969c2535552f631b9f31ae62e36339dc61c3efea0fc73d6bc24415a109bd3"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::call_infer_with_callee_range (cognitive 54): AnswersSolver::call_infer_with_callee_range has cognitive complexity 54 (threshold 15). Drivers by points: if/else 16 (27 pts), match/switch 5 (14 pts), boolean chains 7, loops 3 (6 pts) (nesting depth added 23). 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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":1759}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c9623b0bad5ac0f9e1dee8bebb3773500aa1413768a9f95eb63fae4f6232417"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::get_dataclass_init (cognitive 52): AnswersSolver::get_dataclass_init has cognitive complexity 52 (threshold 15). Drivers by points: if/else 15 (41 pts), boolean chains 6, match/switch 1 (4 pts), loops 1 (nesting depth added 29). 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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":1266}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9ad764f9c9d460939aad653f0f16fa11998414084d5543ed087c56af1a76a67"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::error::suppress::add_suppressions (cognitive 52): pyrefly::lib::error::suppress::add_suppressions has cognitive complexity 52 (threshold 15). Drivers by points: if/else 13 (34 pts), match/switch 3 (8 pts), loops 4 (7 pts), boolean chains 3 (nesting depth added 29). 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":"pyrefly/lib/error/suppress.rs"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"f964b80c31f9718a73a08259a1f8301f2174047e10b23a0cb10de56fb2ca016a"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::decorated_function_type (cognitive 51): AnswersSolver::decorated_function_type has cognitive complexity 51 (threshold 15). Drivers by points: if/else 21 (32 pts), boolean chains 15, loops 2, match/switch 1 (2 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"568d61a6f0fef0d38f373ce4b2643f5fe46ff5c59443a1e60617cc7f278f7b93"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::construct_class_inner (cognitive 50): AnswersSolver::construct_class_inner has cognitive complexity 50 (threshold 15). Drivers by points: if/else 33 (46 pts), boolean chains 4 (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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":1230}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2969d76619660d0e6ac180b061a3a2e599c25c59b7cd2bd0433fc71dc8581f"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::infer_shaped_array_index (cognitive 50): AnswersSolver::infer_shaped_array_index has cognitive complexity 50 (threshold 15). Drivers by points: match/switch 13 (28 pts), if/else 7 (18 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 27). 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3976}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd3af47cb00d9110e0e8c2caa1f9f90587fe5edc9533c93e4f5db3e1f47027c6"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::eval_call (cognitive 49): pyrefly_types::meta_shape_dsl::eval_call has cognitive complexity 49 (threshold 15). Drivers by points: if/else 9 (22 pts), match/switch 6 (15 pts), loops 4 (12 pts) (nesting depth added 30). 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2946}}}],"partialFingerprints":{"codehealthFindingId/v1":"d36209e65c225800c59b711a1b913ce2bb135f36c9c489c628b4777d1f22266d"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::solve_function_binding (cognitive 49): AnswersSolver::solve_function_binding has cognitive complexity 49 (threshold 15). Drivers by points: if/else 21 (38 pts), loops 2 (5 pts), boolean chains 4, match/switch 1 (2 pts) (nesting depth added 21). 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"1570c887e64bebe5259a9b8fcb918ddfe3790619dbb730ddf64bea5d62e1cdf3"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::infer_with_decomposed_hint (cognitive 49): AnswersSolver::infer_with_decomposed_hint has cognitive complexity 49 (threshold 15). Drivers by points: if/else 11 (41 pts), match/switch 1 (5 pts), loops 1 (3 pts) (nesting depth added 36). 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":"pyrefly/lib/alt/unwrap.rs"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"f41c793293c6e319664dd3df7680c74d910c54c1b77b041a51cc9647e05452fa"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::report::cinderx::collect::collect_call_contextual_types (cognitive 49): pyrefly::lib::report::cinderx::collect::collect_call_contextual_types has cognitive complexity 49 (threshold 15). Drivers by points: if/else 16 (38 pts), loops 3 (8 pts), match/switch 1 (2 pts), boolean chains 1 (nesting depth added 28). 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":"pyrefly/lib/report/cinderx/collect.rs"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e64a1869726ff894cc344f245e98618a82170900893a7a58de0e088f7d21380"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::alt::regex::validate_pattern (cognitive 49): pyrefly::lib::alt::regex::validate_pattern has cognitive complexity 49 (threshold 15). Drivers by points: if/else 16 (36 pts), match/switch 3 (9 pts), boolean chains 3, loops 1 (nesting depth added 26). 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":"pyrefly/lib/alt/regex.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"1adcef1b1d0df2a017099f878573ec2cf03761570f8598a976e4e9f10a99b13e"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_args_and_construct_tuple (cognitive 48): AnswersSolver::check_args_and_construct_tuple has cognitive complexity 48 (threshold 15). Drivers by points: if/else 21 (43 pts), boolean chains 2, match/switch 1 (2 pts), loops 1 (nesting depth added 23). 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":"pyrefly/lib/alt/specials.rs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ed6ff8895b967a6b8d829baab684e6c3e25f5bd0b3178cfcb2738372166392e"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::notebook_document_did_change (cognitive 48): Server::notebook_document_did_change has cognitive complexity 48 (threshold 15). Drivers by points: if/else 16 (32 pts), loops 5 (15 pts), match/switch 1 (nesting depth added 26). 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4181}}}],"partialFingerprints":{"codehealthFindingId/v1":"eee27244f05367e76d4cafa1f9aeebc911e45052c206738bdfcacc469b77424e"}},{"ruleId":"D2","level":"warning","message":{"text":"formatter.format_markdown (cognitive 48): formatter.format_markdown has cognitive complexity 48 (threshold 15). Drivers by points: if/else 16 (35 pts), loops 5 (10 pts), boolean chains 3 (nesting depth added 24). 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":"scripts/primer_classifier/formatter.py"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17f988cb57d78126c56c96ff4f6abc5331d58ee296b3055a7c14ad1d1298b15"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::callable_infer_inner (cognitive 47): AnswersSolver::callable_infer_inner has cognitive complexity 47 (threshold 15). Drivers by points: if/else 22 (34 pts), boolean chains 8, match/switch 2 (3 pts), loops 1 (2 pts) (nesting depth added 14). 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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":2207}}}],"partialFingerprints":{"codehealthFindingId/v1":"218e64c82dbd87555f4c3bca531841a5335d2a52ee06510f50755068a7e52e95"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::overload_error (cognitive 47): AnswersSolver::overload_error has cognitive complexity 47 (threshold 15). Drivers by points: if/else 19 (30 pts), match/switch 5 (10 pts), boolean chains 4, loops 3 (nesting depth added 16). 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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e533664206c0c4c41353549e8f73d8a3e4b7493587b49ff43ab55814df041c"}},{"ruleId":"D2","level":"warning","message":{"text":"PysaModuleIndex::build (cognitive 46): PysaModuleIndex::build has cognitive complexity 46 (threshold 15). Drivers by points: if/else 13 (40 pts), loops 4 (5 pts), boolean chains 1 (nesting depth added 28). 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":"pyrefly/lib/report/pysa/module_index.rs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba2b74457271b5d40c6eb56e1cdac2f29299cb15843e6a8bdba834ae864900c3"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::bind_tensor_dimensions (cognitive 46): Subset::bind_tensor_dimensions has cognitive complexity 46 (threshold 15). Drivers by points: if/else 12 (25 pts), loops 7 (14 pts), boolean chains 5, match/switch 2 (nesting depth added 20). Of this number, 45 points are the body\u0027s own statements and 1 belongs to one function item inside it that branches. 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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":3227}}}],"partialFingerprints":{"codehealthFindingId/v1":"569110b549384d8276c7bc5f63dae3557e56f7974bc0cc22e46b9a5ae65eeb2f"}},{"ruleId":"D2","level":"warning","message":{"text":"cross_checker.cross_check_projects (cognitive 46): cross_checker.cross_check_projects has cognitive complexity 46 (threshold 15). Drivers by points: if/else 15 (28 pts), loops 3 (6 pts), boolean chains 4, error handling 2 (4 pts), ternaries 2 (4 pts) (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":"scripts/primer_classifier/cross_checker.py"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c3b53aa7314423843dab6be6cd33770610820d6d25ec2a4947ae04b213d3f10"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeDisplayContext::fmt_params_hover (cognitive 45): TypeDisplayContext::fmt_params_hover has cognitive complexity 45 (threshold 15). Drivers by points: if/else 13 (26 pts), loops 4 (12 pts), match/switch 3 (6 pts), boolean chains 1 (nesting depth added 24). 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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"464becc4610b93c27a6e14865d6223d68703798c8674e33bdd8dc03e45f0c701"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::parse_registered_shaped_array_type (cognitive 45): AnswersSolver::parse_registered_shaped_array_type has cognitive complexity 45 (threshold 15). Drivers by points: if/else 16 (30 pts), boolean chains 8, match/switch 4 (7 pts) (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":5146}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc472c0755e51d822c61dc0b83216bb1e20a2f79a8c8b1961411af3f9b87b884"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::type_params_with_owner (cognitive 45): BindingsBuilder::type_params_with_owner has cognitive complexity 45 (threshold 15). Drivers by points: if/else 13 (37 pts), loops 2 (6 pts), match/switch 1 (2 pts) (nesting depth added 29). 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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":2231}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e96b1ea353d8725896edf090ed0942d0a29f6c0383090787897833e69133e5a"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_build::module_resolver::find_one_part_in_root (cognitive 44): pyrefly_build::module_resolver::find_one_part_in_root has cognitive complexity 44 (threshold 15). Drivers by points: if/else 18 (33 pts), loops 4 (6 pts), match/switch 1 (4 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":"crates/pyrefly_build/src/module_resolver.rs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"208a4203734e4be140c16b472c02197d8ad843a4dd1eb431ec2095628ae19a06"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::get_params_and_paramspec (cognitive 44): AnswersSolver::get_params_and_paramspec has cognitive complexity 44 (threshold 15). Drivers by points: if/else 23 (31 pts), boolean chains 6, match/switch 2 (4 pts), loops 1 (3 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":1316}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9f718ff01f2ee4fe123812c20768d083b2dfdb79695a297b2b66fe1bcfdee90"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::name_assign_infer (cognitive 44): AnswersSolver::name_assign_infer has cognitive complexity 44 (threshold 15). Drivers by points: if/else 15 (31 pts), match/switch 4 (8 pts), boolean chains 5 (nesting depth added 20). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3854}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c5549a62d86ded5046f664ae4d343be7e2854b5b07d15d3ce27ab55fea2d48a"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::stmt_match (cognitive 44): BindingsBuilder::stmt_match has cognitive complexity 44 (threshold 15). Drivers by points: if/else 18 (29 pts), match/switch 4 (9 pts), boolean chains 5, loops 1 (nesting depth added 16). 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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":871}}}],"partialFingerprints":{"codehealthFindingId/v1":"72031aaa947f53e05668b196b67e748d470ef2ba9cb2895dabd888bf725ae369"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::extend_dict_key_suggestions (cognitive 44): Transaction::extend_dict_key_suggestions has cognitive complexity 44 (threshold 15). Drivers by points: if/else 15 (32 pts), loops 3 (11 pts), boolean chains 1 (nesting depth added 25). 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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"b973bacbd168a6444561fae7007356fa261cc5be95d711b0f267cfc4108ac0e1"}},{"ruleId":"D2","level":"warning","message":{"text":"StructurallyValidatedTypeShapeDslFunction::evaluate_generator (cognitive 43): StructurallyValidatedTypeShapeDslFunction::evaluate_generator has cognitive complexity 43 (threshold 15). Drivers by points: if/else 12 (20 pts), match/switch 10 (18 pts), loops 3 (4 pts), boolean chains 1 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6510}}}],"partialFingerprints":{"codehealthFindingId/v1":"f93873fb985d798b564670c45082e0df92e63a93c61f35bf7cbf92365f22020a"}},{"ruleId":"D2","level":"warning","message":{"text":"UpwardSearch::directory_absolute (cognitive 43): UpwardSearch::directory_absolute has cognitive complexity 43 (threshold 15). Drivers by points: if/else 9 (24 pts), loops 6 (12 pts), match/switch 2 (6 pts), boolean chains 1 (nesting depth added 25). 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":"crates/pyrefly_util/src/upward_search.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"cede477f287958d3e7a0630cf49526499a2bd8f64b3409bc29ece2db4c6a48a2"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::extract_shaped_array_metadata (cognitive 43): BindingsBuilder::extract_shaped_array_metadata has cognitive complexity 43 (threshold 15). Drivers by points: if/else 16 (40 pts), loops 2 (3 pts) (nesting depth added 25). 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":"pyrefly/lib/binding/shape_type.rs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab7005d2f435e53b4b47e8dd9d44c7e98431afd0d6157c37e4b7443c0581aef6"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_python::folding::folding_ranges (cognitive 42): pyrefly_python::folding::folding_ranges has cognitive complexity 42 (threshold 15). Drivers by points: if/else 15 (29 pts), loops 5 (8 pts), match/switch 3, 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":"crates/pyrefly_python/src/folding.rs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"681cb90469a5b792f9d66ec822531789c58ecb29d7556401e6e6aba6c1c7660b"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::einops::parse_expression (cognitive 42): pyrefly_types::einops::parse_expression has cognitive complexity 42 (threshold 15). Drivers by points: if/else 17 (33 pts), match/switch 3 (5 pts), boolean chains 3, loops 1 (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":"crates/pyrefly_types/src/einops.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"13741bc0dc3df4ea4ce42cd980ae88e928623fcd50379f1e66eb694aa16c409b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::undecorated_function (cognitive 42): AnswersSolver::undecorated_function has cognitive complexity 42 (threshold 15). Drivers by points: if/else 21 (28 pts), boolean chains 8, loops 1 (3 pts), match/switch 2 (3 pts) (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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd300ebfaecdaab0e25bd417ff0df85496b6e91af470cc32d8657b5c9a8aedab"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::call_overloads (cognitive 42): AnswersSolver::call_overloads has cognitive complexity 42 (threshold 15). Drivers by points: if/else 13 (30 pts), boolean chains 6, loops 2 (5 pts), match/switch 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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcef2619a51df029fc8b6063b3fcc178ee444fc96eba19485745bd924d44f34a"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::merged_flow_info (cognitive 42): BindingsBuilder::merged_flow_info has cognitive complexity 42 (threshold 15). Drivers by points: if/else 17 (35 pts), boolean chains 4, match/switch 2, loops 1 (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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":3903}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0d75f265b94689c04876028e1274d5e698de903da8c076dd89d91792305dfd7"}},{"ruleId":"D2","level":"warning","message":{"text":"Expectation::check (cognitive 42): Expectation::check has cognitive complexity 42 (threshold 15). Drivers by points: if/else 10 (30 pts), loops 3 (7 pts), match/switch 1 (4 pts), boolean chains 1 (nesting depth added 27). 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":"pyrefly/lib/error/expectation.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ca6bd353dca0ab3d8b68fafd38225b9af6f7adf431031c727a9e02b75ae657"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::inferred_types (cognitive 42): Transaction::inferred_types has cognitive complexity 42 (threshold 15). Drivers by points: if/else 7 (25 pts), match/switch 4 (14 pts), boolean chains 2, loops 1 (nesting depth added 28). 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":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":831}}}],"partialFingerprints":{"codehealthFindingId/v1":"18a5ab1e167ccec6e220c5372b5b8e85574d4cb6dd87a887882988cf1d96724f"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::binding::function::function_last_expressions::f (cognitive 42): pyrefly::lib::binding::function::function_last_expressions::f has cognitive complexity 42 (threshold 15). Drivers by points: if/else 13 (24 pts), loops 4 (9 pts), match/switch 2 (5 pts), boolean chains 4 (nesting depth added 19). 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":"pyrefly/lib/binding/function.rs"},"region":{"startLine":980}}}],"partialFingerprints":{"codehealthFindingId/v1":"eba66c946522b8ffff31abe92fa70eaabd2c0956c9bf27ae83ac937539f1bea9"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::einops::evaluate_einops_pattern (cognitive 41): pyrefly_types::einops::evaluate_einops_pattern has cognitive complexity 41 (threshold 15). Drivers by points: if/else 13 (25 pts), match/switch 6 (11 pts), boolean chains 3, loops 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":"crates/pyrefly_types/src/einops.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"93786c8069b73244e9251c8352eef1d2d4851dadfed1637e29cd43ae9baf1498"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::move_module::build_module_member_consumer_import_updates (cognitive 41): pyrefly::lib::state::lsp::quick_fixes::move_module::build_module_member_consumer_import_updates has cognitive complexity 41 (threshold 15). Drivers by points: if/else 13 (33 pts), loops 3 (6 pts), boolean chains 1, match/switch 1 (nesting depth added 23). 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":"pyrefly/lib/state/lsp/quick_fixes/move_module.rs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"21d35daf23d64579210846c4e937686a84d14cf02b5d5fe8409c5580a88604f9"}},{"ruleId":"D2","level":"warning","message":{"text":"generate_protocol.convert_json_to_model (cognitive 41): generate_protocol.convert_json_to_model has cognitive complexity 41 (threshold 15). Drivers by points: loops 13 (21 pts), if/else 8 (15 pts), error handling 1 (3 pts), ternaries 1 (2 pts) (nesting depth added 18). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"a74a3515e3617f4b65349c70e2ebaab8d17daa0bf74b0c925e19111a6bc0d4e1"}},{"ruleId":"D2","level":"warning","message":{"text":"__main__.collect_issue_data (cognitive 41): __main__.collect_issue_data has cognitive complexity 41 (threshold 15). Drivers by points: if/else 14 (24 pts), loops 8 (12 pts), boolean chains 4, ternaries 1 (nesting depth added 14). 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":"scripts/issue_ranker/__main__.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"759b77d2df9c70f6b68ae449669b970b543d186e0953dc87fdf67c6ae7dada75"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_signature_consistency (cognitive 40): AnswersSolver::check_signature_consistency has cognitive complexity 40 (threshold 15). Drivers by points: if/else 9 (16 pts), match/switch 7 (14 pts), loops 3 (7 pts), boolean chains 3 (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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2240}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6bbfeadd480d6eeabde2c10fea337dff6564857d643540004b51fc4bbfcedd2"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::binding_to_type (cognitive 40): AnswersSolver::binding_to_type has cognitive complexity 40 (threshold 15). Drivers by points: if/else 11 (23 pts), boolean chains 7, match/switch 4 (7 pts), loops 1 (3 pts) (nesting depth added 17). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6303}}}],"partialFingerprints":{"codehealthFindingId/v1":"e312de119edbba15d059105227d44eee9b82a3e5e876e389dd0cb11a2445f384"}},{"ruleId":"D2","level":"warning","message":{"text":"Binding::fmt (cognitive 40): Binding::fmt has cognitive complexity 40 (threshold 15). Drivers by points: if/else 8 (19 pts), match/switch 8 (15 pts), loops 3 (6 pts) (nesting depth added 21). 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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":2699}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf0ff0dde69165b5e328b62eaa49a2ada0f66227be3d3708b3e606decbd0b19"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::solve_django_reverse_relations (cognitive 39): AnswersSolver::solve_django_reverse_relations has cognitive complexity 39 (threshold 15). Drivers by points: if/else 11 (31 pts), loops 3 (4 pts), match/switch 1 (3 pts), boolean chains 1 (nesting depth added 23). 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":"pyrefly/lib/alt/class/django.rs"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"32071c5849f7fe72060e5ab96720fa32a5d1cefac4170240999cee549574cc83"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::is_subset_eq_quantified (cognitive 39): Subset::is_subset_eq_quantified has cognitive complexity 39 (threshold 15). Drivers by points: if/else 23 (33 pts), boolean chains 3, match/switch 2 (3 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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3563}}}],"partialFingerprints":{"codehealthFindingId/v1":"01f937fba54bd829c593cee740d4a47c77c5bc9c3d4fd89c5a3228aa745d5be1"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::einsum::parse_einops_einsum_equation (cognitive 38): pyrefly_types::einsum::parse_einops_einsum_equation has cognitive complexity 38 (threshold 15). Drivers by points: if/else 11 (27 pts), loops 3 (4 pts), match/switch 2 (4 pts), boolean chains 3 (nesting depth added 19). 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":"crates/pyrefly_types/src/einsum.rs"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cbba4abf1d8d80b645ec4821b49a5db3f7c3b096f97ba387cab1f252e7ef826"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::parse_dimension_expr_with_context (cognitive 38): AnswersSolver::parse_dimension_expr_with_context has cognitive complexity 38 (threshold 15). Drivers by points: match/switch 8 (19 pts), if/else 7 (14 pts), boolean chains 5 (nesting depth added 18). 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":4342}}}],"partialFingerprints":{"codehealthFindingId/v1":"0088e49341ff001c16a99b1aea602f238fe73cc4cdda195ab5ebb19e8d2c81d0"}},{"ruleId":"D2","level":"warning","message":{"text":"CallArg::pre_eval (cognitive 38): CallArg::pre_eval has cognitive complexity 38 (threshold 15). Drivers by points: if/else 8 (20 pts), loops 3 (10 pts), match/switch 3 (7 pts), boolean chains 1 (nesting depth added 23). 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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b653b8ad41ae329d6752a86d9bd05f8b1793e13efdc249d4d600e2dd9e5bbb9"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::dict_literal_string_literal_at (cognitive 38): Transaction::dict_literal_string_literal_at has cognitive complexity 38 (threshold 15). Drivers by points: if/else 9 (24 pts), boolean chains 6, match/switch 2 (5 pts), loops 2 (3 pts) (nesting depth added 19). 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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":626}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fd6b173907cca1f7921429914d4352881edc227ce7d625e38df3988dea3eb97"}},{"ruleId":"D2","level":"warning","message":{"text":"SysInfo::evaluate (cognitive 37): SysInfo::evaluate has cognitive complexity 37 (threshold 15). Drivers by points: match/switch 10 (26 pts), loops 2 (6 pts), boolean chains 5 (nesting depth added 20). 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":"crates/pyrefly_python/src/sys_info.rs"},"region":{"startLine":898}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d3876e7485504b0c2342bef373b026db5fcc5d8e469b1270528b62d01cc97d"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeShapeDslHelperCall::argument_domains (cognitive 37): TypeShapeDslHelperCall::argument_domains has cognitive complexity 37 (threshold 15). Drivers by points: if/else 12 (25 pts), match/switch 5 (9 pts), boolean chains 3 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d1e5fa79c97bb37837e590c3e873186ea0f5c39ccd0662a3d606953a64e436"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::polars_join (cognitive 37): AnswersSolver::polars_join has cognitive complexity 37 (threshold 15). Drivers by points: if/else 14 (21 pts), match/switch 5 (7 pts), loops 5, boolean chains 4 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":3225}}}],"partialFingerprints":{"codehealthFindingId/v1":"57fa677fb69f7cb5804bd9c4fa8a76865dc53602480c32cf7bbe9cc94e4de14b"}},{"ruleId":"D2","level":"warning","message":{"text":"InitArgs::create_config (cognitive 37): InitArgs::create_config has cognitive complexity 37 (threshold 15). Drivers by points: if/else 21 (32 pts), boolean chains 5 (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":"pyrefly/lib/commands/init.rs"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5d42ad8b4bae5f4313cad6b3240b1e7b096bb0f40357d1ee7555ebf3b47cfe8"}},{"ruleId":"D2","level":"warning","message":{"text":"parser.parse_primer_diff (cognitive 37): parser.parse_primer_diff has cognitive complexity 37 (threshold 15). Drivers by points: if/else 11 (33 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 23). 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":"scripts/primer_classifier/parser.py"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e60ecd031129147fcaff7407a4528c5e6e423fb2f65987772f0931170be81cf"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::val_to_type (cognitive 36): pyrefly_types::meta_shape_dsl::val_to_type has cognitive complexity 36 (threshold 15). Drivers by points: if/else 10 (21 pts), match/switch 6 (12 pts), loops 1 (2 pts), boolean chains 1 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":3302}}}],"partialFingerprints":{"codehealthFindingId/v1":"8773ee96e348e271aee7c9b1ea910f44694ea0e5a360342a3dc40cd115b6277f"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::get_dataclass_synthesized_fields (cognitive 36): AnswersSolver::get_dataclass_synthesized_fields has cognitive complexity 36 (threshold 15). Drivers by points: if/else 19 (29 pts), match/switch 3 (4 pts), boolean chains 3 (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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9055b7cb0635aefa752f9cb78e7fa66bbb4c6d9ca1f307bb90955e70a547433"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::dict_literal_value_string_literal_at (cognitive 36): Transaction::dict_literal_value_string_literal_at has cognitive complexity 36 (threshold 15). Drivers by points: if/else 8 (22 pts), boolean chains 6, match/switch 2 (5 pts), loops 2 (3 pts) (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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":684}}}],"partialFingerprints":{"codehealthFindingId/v1":"d795594ef0b6b1e67e6c5eefbd4d66bdf99ac8cc4e178214ead5cf6e3aaaeb69"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfigOverrideArgs::override_config_at (cognitive 35): ConfigOverrideArgs::override_config_at has cognitive complexity 35 (threshold 15). Drivers by points: if/else 24 (27 pts), loops 5, boolean chains 2, match/switch 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":"crates/pyrefly_config/src/args.rs"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"35eceecb87c03c6a2d6e4cd5d17a7a731ca45621ab85ad0b1fcc3867da34b68e"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::dimension::canonicalize_division (cognitive 35): pyrefly_types::dimension::canonicalize_division has cognitive complexity 35 (threshold 15). Drivers by points: if/else 16 (30 pts), boolean chains 2, loops 1 (2 pts), match/switch 1 (nesting depth added 15). 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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"533e511e170ef97d45f02a7a1a36296d51d52c686cbfdcb5b3a193615c1fef60"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::as_instance_attribute (cognitive 35): AnswersSolver::as_instance_attribute has cognitive complexity 35 (threshold 15). Drivers by points: if/else 17 (28 pts), match/switch 4 (6 pts), boolean chains 1 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3511}}}],"partialFingerprints":{"codehealthFindingId/v1":"f90dbc7657ff284859dd28cdcbaa9b2f056759b518a7bf157521f9feea5e87c4"}},{"ruleId":"D2","level":"warning","message":{"text":"InferArgs::run_inner (cognitive 35): InferArgs::run_inner has cognitive complexity 35 (threshold 15). Drivers by points: if/else 14 (28 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 15). 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":"pyrefly/lib/commands/infer.rs"},"region":{"startLine":326}}}],"partialFingerprints":{"codehealthFindingId/v1":"be8c21f806fb462a13d49c2bbd44a8f2541b741f429b8cab2dc9fa9792cb83cf"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::collect_module_reports (cognitive 35): pyrefly::lib::commands::coverage::collect::collect_module_reports has cognitive complexity 35 (threshold 15). Drivers by points: if/else 15 (24 pts), loops 4 (7 pts), boolean chains 4 (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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":1613}}}],"partialFingerprints":{"codehealthFindingId/v1":"372f4cc1c14e368ce6b0ca11078fdd9aeab9ab60671983c29537f611f11057e4"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::lsp::non_wasm::server::dispatch_lsp_events (cognitive 35): pyrefly::lib::lsp::non_wasm::server::dispatch_lsp_events has cognitive complexity 35 (threshold 15). Drivers by points: if/else 18 (28 pts), match/switch 2 (6 pts), loops 1 (nesting depth added 14). 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1436}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c970b8f64f5330f33d0061d2726b8ff2fa2b780a8847623c1eca800bb9c005c"}},{"ruleId":"D2","level":"warning","message":{"text":"github_utils.list_contributors_main (cognitive 35): github_utils.list_contributors_main has cognitive complexity 35 (threshold 15). Drivers by points: if/else 11 (18 pts), ternaries 2 (8 pts), boolean chains 7, error handling 2 (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":"scripts/github_utils.py"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b48d73eff8cef29ed506d3259179a0c1299ad1974d077eb6d5cb9d9615e9ca0"}},{"ruleId":"D2","level":"warning","message":{"text":"llm_client._build_suggestion_user_prompt (cognitive 35): llm_client._build_suggestion_user_prompt has cognitive complexity 35 (threshold 15). Drivers by points: if/else 12 (22 pts), loops 5 (11 pts), boolean chains 2 (nesting depth added 16). 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":"scripts/primer_classifier/llm_client.py"},"region":{"startLine":660}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cd94f77c53dcc25fe5a073dc58a6a8df27c3ba225c3335af68dc0f4782d775d"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::convert_expr (cognitive 34): pyrefly_types::meta_shape_dsl::convert_expr has cognitive complexity 34 (threshold 15). Drivers by points: match/switch 9 (18 pts), if/else 6 (11 pts), loops 2 (5 pts) (nesting depth added 17). 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1030}}}],"partialFingerprints":{"codehealthFindingId/v1":"90be1713cd0a7bc6f3c168df0a85d3ec9fe2e4e660a1a2d2c492f04b61cd9eec"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::typevar_from_call (cognitive 34): AnswersSolver::typevar_from_call has cognitive complexity 34 (threshold 15). Drivers by points: if/else 18 (27 pts), match/switch 2 (5 pts), boolean chains 1, loops 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":2772}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cf7079b372c6bee6b556638fdfa7c9708b47b484ee1e9f5e8dace3354b30973"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::intersect_impl (cognitive 34): AnswersSolver::intersect_impl has cognitive complexity 34 (threshold 15). Drivers by points: if/else 18 (24 pts), boolean chains 8, match/switch 1 (2 pts) (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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"700e02ca346b6d92c47376ea1165b670d89e2cf69c194a7fed26593748a11f88"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::polars_expr_output_name (cognitive 34): AnswersSolver::polars_expr_output_name has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (28 pts), match/switch 3 (6 pts) (nesting depth added 20). 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2719}}}],"partialFingerprints":{"codehealthFindingId/v1":"39270d7c80a20dd4d6253dfad27eeebf6a1f1ccfcabf2645797f92f46cae6b17"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::call_assert_shape (cognitive 34): AnswersSolver::call_assert_shape has cognitive complexity 34 (threshold 15). Drivers by points: if/else 12 (24 pts), match/switch 2 (6 pts), boolean chains 2, loops 2 (nesting depth added 16). 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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd64fe28d76a1e927772b4d1c07155443ed504ac4cf92f84848d7c7eaac2ecbd"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::resolve_type_shape_dsl_intrinsic (cognitive 34): AnswersSolver::resolve_type_shape_dsl_intrinsic has cognitive complexity 34 (threshold 15). Drivers by points: if/else 28, boolean chains 6. 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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":915}}}],"partialFingerprints":{"codehealthFindingId/v1":"348cf79b2aa3ab66adedd9a6e72246f1628b28708631984a962890767c8d12a8"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::extract_django_fields_from_class_body (cognitive 34): BindingsBuilder::extract_django_fields_from_class_body has cognitive complexity 34 (threshold 15). Drivers by points: if/else 8 (24 pts), loops 2 (4 pts), boolean chains 3, match/switch 1 (3 pts) (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":"pyrefly/lib/binding/django.rs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"ace999fc279409e278acc050168cd933a7a12c78aacc6ec153348b34c97bc8ad"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::is_subset_tuple (cognitive 34): Subset::is_subset_tuple has cognitive complexity 34 (threshold 15). Drivers by points: if/else 16 (25 pts), match/switch 4 (6 pts), boolean chains 3 (nesting depth added 11). 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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"e54e56a5c1dfd747f5f9657506592fe6f60d3adc5322fdacaee68a8954f5c210"}},{"ruleId":"D2","level":"warning","message":{"text":"generate_protocol.replace_integer_enum (cognitive 34): generate_protocol.replace_integer_enum has cognitive complexity 34 (threshold 15). Drivers by points: if/else 14 (27 pts), loops 4 (6 pts), boolean chains 1 (nesting depth added 15). 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":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":726}}}],"partialFingerprints":{"codehealthFindingId/v1":"bad0bb28f9292221f737987628280fb5ab9c71385b6f5063ae0fd85b0eff87a6"}},{"ruleId":"D2","level":"warning","message":{"text":"compare_typecheckers.check_project (cognitive 34): compare_typecheckers.check_project has cognitive complexity 34 (threshold 15). Drivers by points: if/else 17 (20 pts), boolean chains 9, ternaries 5 (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":"scripts/compare_typecheckers.py"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d73af003cc737e5912d9d2739097857b72ebd78f5ed48e7fcde2573194afcc0"}},{"ruleId":"D2","level":"warning","message":{"text":"github_utils.fetch_bug_issues (cognitive 34): github_utils.fetch_bug_issues has cognitive complexity 34 (threshold 15). Drivers by points: if/else 9 (24 pts), loops 3 (5 pts), error handling 1 (3 pts), boolean chains 2 (nesting depth added 19). 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":"scripts/github_utils.py"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f3fd5d028361145d838b1c0de6db0feacdbc6eede154339465c10b15f07d1fd"}},{"ruleId":"D2","level":"warning","message":{"text":"llm_transport._extract_json (cognitive 34): llm_transport._extract_json has cognitive complexity 34 (threshold 15). Drivers by points: if/else 7 (21 pts), error handling 3 (9 pts), loops 2 (4 pts) (nesting depth added 22). 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":"scripts/llm_transport.py"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"5916aa0130980f265652e0c6d904ac8c7b85559a8cae0f6be619dd88763dbf2d"}},{"ruleId":"D2","level":"warning","message":{"text":"llm_client._parse_classification (cognitive 34): llm_client._parse_classification has cognitive complexity 34 (threshold 15). Drivers by points: if/else 6 (19 pts), error handling 3 (8 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 20). 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":"scripts/primer_classifier/llm_client.py"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"93c309d6141d4fbc05a8e0046fdaa4ef16a2d99810b3e1f20f2eb03e34aba789"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_config::migration::mypy::pyproject::pyproject_to_ini (cognitive 33): pyrefly_config::migration::mypy::pyproject::pyproject_to_ini has cognitive complexity 33 (threshold 15). Drivers by points: if/else 28 (30 pts), loops 2 (3 pts) (nesting depth added 3). 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":"crates/pyrefly_config/src/migration/mypy/pyproject.rs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"2834d5b4fd279c507d1b4c11533b6d407a1343b9be4e886c09439df6502e0bc2"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::dimension::canonicalize_product (cognitive 33): pyrefly_types::dimension::canonicalize_product has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (22 pts), loops 3 (6 pts), match/switch 1 (3 pts), boolean chains 2 (nesting depth added 15). 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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":780}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fbb6b3741e5b9a998e200da1e85b32e19acf729f0fb59b61f70278db9f9492a"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::binop_types (cognitive 33): AnswersSolver::binop_types has cognitive complexity 33 (threshold 15). Drivers by points: if/else 15 (20 pts), boolean chains 6, match/switch 4 (6 pts), loops 1 (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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"91858080526a49eb4233df72f6683c4535325398aa52e4cb074bcce167463882"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::validate_type_var_default (cognitive 33): AnswersSolver::validate_type_var_default has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (17 pts), match/switch 7 (13 pts), boolean chains 3 (nesting depth added 11). Of this number, 32 points are the body\u0027s own statements and 1 belongs 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3564}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3660cbc2c3b309aa4c229c8f4dd3d8a2eaf44f46319d0fec130490670f65906"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::bind_module_exports (cognitive 33): BindingsBuilder::bind_module_exports has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (29 pts), loops 2 (4 pts) (nesting depth added 19). 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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":2076}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8a8c5fd17be54a2a47c8031e3d47d7658f2e9ee17512c323116b4663822c087"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::clean (cognitive 33): Transaction::clean has cognitive complexity 33 (threshold 15). Drivers by points: if/else 13 (24 pts), boolean chains 4, loops 2 (3 pts), match/switch 1 (2 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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1292}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcde3c38bf6c252e75a026e66305e5a7c3a49a2b5ea136195def43c075271a70"}},{"ruleId":"D2","level":"warning","message":{"text":"score.score_issue (cognitive 33): score.score_issue has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (19 pts), boolean chains 7, loops 4 (6 pts), ternaries 1 (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":"scripts/issue_ranker/passes/score.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b79db4bb71201c32721146eb022619c06455cd27fab5221f6e3d23dfaed59b3"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::simplify::collapse_literals (cognitive 32): pyrefly_types::simplify::collapse_literals has cognitive complexity 32 (threshold 15). Drivers by points: if/else 6 (10 pts), match/switch 4 (10 pts), boolean chains 9, loops 3 (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":"crates/pyrefly_types/src/simplify.rs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d47badec0fc645b0b86c6faa6828c099e5f7f864e13c2ecfa9edbff9a044aa1"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::infer_call (cognitive 32): pyrefly_types::meta_shape_dsl::infer_call has cognitive complexity 32 (threshold 15). Drivers by points: if/else 10 (27 pts), match/switch 3 (5 pts) (nesting depth added 19). 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1938}}}],"partialFingerprints":{"codehealthFindingId/v1":"b88f581fc956005a3bb7336b910d187e64d6ada4f4a36dafe8065e55b7e8cce1"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::eval_polars_expr (cognitive 32): AnswersSolver::eval_polars_expr has cognitive complexity 32 (threshold 15). Drivers by points: if/else 8 (23 pts), match/switch 3 (6 pts), loops 1 (3 pts) (nesting depth added 20). 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2507}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcf96e7ff8eb1747b21114d057a2ea9461468e194056b903da71e08efd152885"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::polars_fill_null (cognitive 32): AnswersSolver::polars_fill_null has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (17 pts), match/switch 4 (11 pts), boolean chains 2, loops 2 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2991}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb962d85fd0dc990fcd313fdb85632aef942ed57e15631311495c460d01c6fd"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::class_def_inner (cognitive 32): BindingsBuilder::class_def_inner has cognitive complexity 32 (threshold 15). Drivers by points: if/else 13 (20 pts), match/switch 5 (7 pts), boolean chains 3, loops 2 (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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4271f1648f287edc19be52a8e4d73c6efe7adecd21a6e60dc98ab4eca300697"}},{"ruleId":"D2","level":"warning","message":{"text":"Scopes::finish_class_and_get_field_definitions (cognitive 32): Scopes::finish_class_and_get_field_definitions has cognitive complexity 32 (threshold 15). Drivers by points: if/else 14 (24 pts), match/switch 2 (5 pts), boolean chains 3 (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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":3091}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2e2739dedc3dca4440ec788d928a42728e93d2f22271ed165e36dd342816662"}},{"ruleId":"D2","level":"warning","message":{"text":"ContextualTypeCollector::visit_stmt (cognitive 32): ContextualTypeCollector::visit_stmt has cognitive complexity 32 (threshold 15). Drivers by points: if/else 10 (22 pts), match/switch 2 (5 pts), boolean chains 3, loops 1 (2 pts) (nesting depth added 16). 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":"pyrefly/lib/report/cinderx/collect.rs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"24b2800548eb8d8f679550aad5863d963072e68d9d954fd0764abf20c70f30bf"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::find_operator_dunder (cognitive 32): Transaction::find_operator_dunder has cognitive complexity 32 (threshold 15). Drivers by points: if/else 10 (25 pts), match/switch 3 (5 pts), loops 1 (2 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2244}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eb115281127b6561d53d1b8644f7a1e6c81a51f4a7474c16c4906e615e5ff5b"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::detect_editable_packages (cognitive 32): Transaction::detect_editable_packages has cognitive complexity 32 (threshold 15). Drivers by points: if/else 10 (29 pts), loops 2 (3 pts) (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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":3980}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd4f5b4bfa420d24a37ce19c42540a9383d6b39c87b9ef185c4f5b92ef108de"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::lsp::non_wasm::document_symbols::build_symbols_with_sections (cognitive 32): pyrefly::lib::lsp::non_wasm::document_symbols::build_symbols_with_sections has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (21 pts), loops 5 (9 pts), boolean chains 2 (nesting depth added 14). 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":"pyrefly/lib/lsp/non_wasm/document_symbols.rs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5825c9d04a595dfe7e9b4be73853bd6d5ef28db10d22128a71d8bb553e21279"}},{"ruleId":"D2","level":"warning","message":{"text":"StructurallyValidatedTypeShapeDslFunction::evaluate_any_generator (cognitive 31): StructurallyValidatedTypeShapeDslFunction::evaluate_any_generator has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 6 (15 pts), if/else 8 (12 pts), boolean chains 3, loops 1 (nesting depth added 13). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7664}}}],"partialFingerprints":{"codehealthFindingId/v1":"1865b572ef152f315c88238668c34a027b8262ef9b5cd4d58c64a9a9ea7a2ad2"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::infer_expr (cognitive 31): pyrefly_types::meta_shape_dsl::infer_expr has cognitive complexity 31 (threshold 15). Drivers by points: if/else 12 (22 pts), match/switch 5 (9 pts) (nesting depth added 14). 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2049}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a3bc4b111c6ceaed9147ada33a1b675effbb8b066f3009430ce71327a8cf0ed"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::apply_special_form (cognitive 31): AnswersSolver::apply_special_form has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (19 pts), match/switch 6 (12 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":"pyrefly/lib/alt/specials.rs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"3202f4bab3c353d15a43eeb152b31c1b85d0d19b29eccf28f4bf88656ab6e3fa"}},{"ruleId":"D2","level":"warning","message":{"text":"Linearization::merge (cognitive 31): Linearization::merge has cognitive complexity 31 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 5 (12 pts), match/switch 1 (5 pts) (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":"pyrefly/lib/alt/types/class_metadata.rs"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"5738a1c49055dbdbd6f8639997ef7336c5d16b76254301eb78106776b1de525c"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::typealiastype_from_call (cognitive 31): BindingsBuilder::typealiastype_from_call has cognitive complexity 31 (threshold 15). Drivers by points: if/else 15 (25 pts), match/switch 2 (5 pts), loops 1 (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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"506f40faba4529b0105445504602a4cc5964e18c7128943f073a8acca76737f2"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::type_hierarchy_subtype_items (cognitive 31): Server::type_hierarchy_subtype_items has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (26 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 16). 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":6821}}}],"partialFingerprints":{"codehealthFindingId/v1":"e431f422865996c9854c373f001e17ee850b17d4e27d0536a7d49b5ee318feec"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::add_autoimport_completions (cognitive 31): Transaction::add_autoimport_completions has cognitive complexity 31 (threshold 15). Drivers by points: if/else 10 (24 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 16). 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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"8092cca2d3c9d627946c28632327d8a0a0817e9cf5d803964634fbb6ed42019b"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::stubgen::extract::extract_stmts (cognitive 31): pyrefly::lib::stubgen::extract::extract_stmts has cognitive complexity 31 (threshold 15). Drivers by points: if/else 8 (22 pts), loops 2 (5 pts), boolean chains 2, match/switch 1 (2 pts) (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":"pyrefly/lib/stubgen/extract.rs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bbfc8679423d786f400829b4e953e3d27e611bc06caba7f06ad2ae560051c38"}},{"ruleId":"D2","level":"warning","message":{"text":"conformance_output.main (cognitive 31): conformance_output.main has cognitive complexity 31 (threshold 15). Drivers by points: if/else 14 (24 pts), loops 2 (4 pts), ternaries 1 (3 pts) (nesting depth added 14). 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":"conformance/conformance_output.py"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"c96e8ba62ab37322f526d0d8bd22443d12553be9d22ae7ad73aeaf757a21643b"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_python::docstring::parse_google_params (cognitive 30): pyrefly_python::docstring::parse_google_params has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (26 pts), boolean chains 3, loops 1 (nesting depth added 14). 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":"crates/pyrefly_python/src/docstring.rs"},"region":{"startLine":525}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e83bd32a8a69bda7ee6fea43f79192c2d3f853d69a36a1ba3ad9e8de63675d4"}},{"ruleId":"D2","level":"warning","message":{"text":"DslValidator::collect_integer_expression_sources (cognitive 30): DslValidator::collect_integer_expression_sources has cognitive complexity 30 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 3 (11 pts), match/switch 2 (4 pts), boolean chains 3 (nesting depth added 17). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2168}}}],"partialFingerprints":{"codehealthFindingId/v1":"a06513ca058cbca01c7003d7da4e2b455fc543309acf43aa1e6b3dadb35d552a"}},{"ruleId":"D2","level":"warning","message":{"text":"DslValidator::validate_generator_source (cognitive 30): DslValidator::validate_generator_source has cognitive complexity 30 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 5, match/switch 3 (5 pts), loops 1 (3 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3086}}}],"partialFingerprints":{"codehealthFindingId/v1":"640c5d7178a9dac1a680df0d58ff975762e4ac7e1e7b64b44691035403ac5626"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::expr_annotation (cognitive 30): AnswersSolver::expr_annotation has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (19 pts), boolean chains 8, match/switch 2 (3 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":794}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef8dd5c305f31145f3a69aff95ee0f2ab3a15b4995761d52c8501aa49bb5094d"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::prescan_synthesized_bases (cognitive 30): BindingsBuilder::prescan_synthesized_bases has cognitive complexity 30 (threshold 15). Drivers by points: if/else 7 (20 pts), match/switch 2 (8 pts), loops 1 (2 pts) (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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"38366abf101e7779c73050bba90e2c505d2426e07b2ec730039e49e4e6ba6282"}},{"ruleId":"D2","level":"warning","message":{"text":"Solver::simplify_mut (cognitive 30): Solver::simplify_mut has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (16 pts), loops 2 (6 pts), match/switch 3 (6 pts), boolean chains 2 (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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1207}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3b39f30ccb5b4a9fb5bac506457aabc59ce30d35fce3fddded885631d757b5a"}},{"ruleId":"D2","level":"warning","message":{"text":"ImportTracker::from_ast (cognitive 30): ImportTracker::from_ast has cognitive complexity 30 (threshold 15). Drivers by points: if/else 7 (21 pts), loops 3 (7 pts), match/switch 1 (2 pts) (nesting depth added 19). 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":"pyrefly/lib/state/import_tracker.rs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f109b7bb5b01e55fa842dffd1c368ebae6633923c46dabf96028b798653c4e3"}},{"ruleId":"D2","level":"warning","message":{"text":"ContributorAnalyzer._extract_contributors (cognitive 30): ContributorAnalyzer._extract_contributors has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (27 pts), boolean chains 2, loops 1 (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":"scripts/github_utils.py"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"c168ac3d7a84498ddb67d7742adf95dbdfe6b4faf2cbafe8fbcbb6fb48f0462b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::analyze_class_field_value (cognitive 29): AnswersSolver::analyze_class_field_value has cognitive complexity 29 (threshold 15). Drivers by points: if/else 14 (22 pts), match/switch 3 (5 pts), boolean chains 2 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3026}}}],"partialFingerprints":{"codehealthFindingId/v1":"b868ed6943a63d002b7517f12da74cf938f665672bbf810c5ab84f176ba31f8d"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::calculate_typed_dict_field (cognitive 29): AnswersSolver::calculate_typed_dict_field has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (20 pts), match/switch 4 (5 pts), boolean chains 3, 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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":1000}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f1af03b46a66acead3f62516eb7baf1426f29793dc65a9438dd95057684e3e"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::publish_for_handles (cognitive 29): Server::publish_for_handles has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 7 (11 pts), match/switch 1 (3 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":3393}}}],"partialFingerprints":{"codehealthFindingId/v1":"6604d946582354f21a453da5a4c25211b1776a78eb24314dc443a31a3be021f0"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::parse_variables (cognitive 29): pyrefly::lib::commands::coverage::collect::parse_variables has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (12 pts), match/switch 5 (12 pts), boolean chains 4, loops 1 (nesting depth added 11). Of this number, 22 points are the body\u0027s own statements and 7 belong to 2 function items inside it that branch. 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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"26cf50ec047e19c316392fc73d876a1c6f732854158e9c80c6e5968549fd0f51"}},{"ruleId":"D2","level":"warning","message":{"text":"github_utils.load_env_file (cognitive 29): github_utils.load_env_file has cognitive complexity 29 (threshold 15). Drivers by points: if/else 8 (20 pts), boolean chains 5, loops 2 (4 pts) (nesting depth added 14). 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":"scripts/github_utils.py"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"c785f2b4c62cd7fee88e6f4b7efbdc3c4456c46f6a6be60a0bf4020a90f97776"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::compare_types (cognitive 28): AnswersSolver::compare_types has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (21 pts), boolean chains 3, match/switch 2 (3 pts), loops 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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a32c0c4c7508704854276e12cccf47511b6faaf4ec228965113ce6462d99abe"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::polars_construct_options (cognitive 28): AnswersSolver::polars_construct_options has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (17 pts), loops 3 (7 pts), match/switch 3 (4 pts) (nesting depth added 16). 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1965}}}],"partialFingerprints":{"codehealthFindingId/v1":"6701708e005121c9583a3b096873b2f6d6a676292a894b61639ac403d927154f"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::validate_type_form (cognitive 28): AnswersSolver::validate_type_form has cognitive complexity 28 (threshold 15). Drivers by points: if/else 15 (17 pts), boolean chains 10, match/switch 1 (nesting depth added 2). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":7196}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb7204aada43a9cd74245da990f322ccb2a92eda904aaf633393a87e01a573ab"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::parse_type_shape_dsl_argument (cognitive 28): AnswersSolver::parse_type_shape_dsl_argument has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (21 pts), match/switch 3 (5 pts), boolean chains 2 (nesting depth added 13). 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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":1153}}}],"partialFingerprints":{"codehealthFindingId/v1":"541ccb70802d0796f95ab93c143ecd55d3c0008e02c73850889b4f12142ad401"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::ensure_name_impl (cognitive 28): BindingsBuilder::ensure_name_impl has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (21 pts), boolean chains 6, match/switch 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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5c77f4403ffe33cd7298d0d2bd58b29515f3f6126dcca696cc9552104757a4d"}},{"ruleId":"D2","level":"warning","message":{"text":"rank.rank_issues (cognitive 28): rank.rank_issues has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (9 pts), loops 5 (9 pts), error handling 2 (6 pts), ternaries 2 (3 pts), boolean chains 1 (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":"scripts/issue_ranker/passes/rank.py"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dbf55d8d00e5e326eaf9a54f26a06c2a890374add91bbeea332c9838bd96529"}},{"ruleId":"D2","level":"warning","message":{"text":"report_formatter.format_markdown (cognitive 28): report_formatter.format_markdown has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (17 pts), loops 6 (11 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":"scripts/issue_ranker/report_formatter.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b90c05fba11e7464cb67867c3e4a4b8d6059f3004205be09eca58a2389f7462"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_python::ignore::parse_ignore_all (cognitive 27): pyrefly_python::ignore::parse_ignore_all has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (21 pts), boolean chains 5, loops 1 (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":"crates/pyrefly_python/src/ignore.rs"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"5539959c48e7288a39778a66c9cfa455350a4284546ae48ea71aa5eb153e0b42"}},{"ruleId":"D2","level":"warning","message":{"text":"Tuple::fmt_with_type (cognitive 27): Tuple::fmt_with_type has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (18 pts), loops 3 (8 pts), match/switch 1 (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":"crates/pyrefly_types/src/tuple.rs"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"174674da918fb9f1722af205ef2dda1ecb5f48ad4f6f204a3a939620d38910f4"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::is_protocol_subset_at_attr (cognitive 27): AnswersSolver::is_protocol_subset_at_attr has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (21 pts), boolean chains 3, loops 1 (3 pts) (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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":1466}}}],"partialFingerprints":{"codehealthFindingId/v1":"c56097e7f30ff36cb5557620a2c61cb14a2ce81a448c458cd795b06cd9806ec5"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::constrain_forwarded_overload_return (cognitive 27): AnswersSolver::constrain_forwarded_overload_return has cognitive complexity 27 (threshold 15). Drivers by points: if/else 14 (21 pts), match/switch 3 (4 pts), boolean chains 2 (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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":1982}}}],"partialFingerprints":{"codehealthFindingId/v1":"6710e3adc1443773eea96e367ebeec449fbd20f7187664c99a81b0b67ceb2cea"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::determine_read_only_reason (cognitive 27): AnswersSolver::determine_read_only_reason has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15 (22 pts), boolean chains 5 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":2857}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9fffddcca0066afe881d5a2b27c40e5f75cf00c7b7df937e03b2665d79241d2"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::parse_base_class (cognitive 27): AnswersSolver::parse_base_class has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 7 (14 pts), if/else 7 (11 pts), boolean chains 2 (nesting depth added 11). 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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1649}}}],"partialFingerprints":{"codehealthFindingId/v1":"5de6dc85db53d919f695aac8d12012945ce17f669f93215f7718df6f4a7a472f"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_dict_items_against_typed_dict (cognitive 27): AnswersSolver::check_dict_items_against_typed_dict has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 4, match/switch 2 (4 pts), loops 1 (2 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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad64afb3f966f8375144e2164ba5e94f5a22aa9941357a2bccf4923831434b6c"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::try_int_binop (cognitive 27): AnswersSolver::try_int_binop has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (19 pts), match/switch 5 (7 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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b270fd0d4ee802333a4986e940b80958a3d1f216fbc71b37a0bf59614316b8d"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::class_bases_of (cognitive 27): AnswersSolver::class_bases_of has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (14 pts), match/switch 5 (10 pts), boolean chains 3 (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":"pyrefly/lib/alt/types/class_bases.rs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aec502e73cd6bd30013b4702e5f79d97ac28db077a40f077716b46931290abe"}},{"ruleId":"D2","level":"warning","message":{"text":"ArgsExpander::expand (cognitive 27): ArgsExpander::expand has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 4 (12 pts), if/else 5 (10 pts), loops 2 (5 pts) (nesting depth added 16). 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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"a00af297e39165f2a92204fe4ceeb802e07f45d4fedeed922e5cd1139831e061"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::ensure_type_impl (cognitive 27): BindingsBuilder::ensure_type_impl has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 10, if/else 6 (9 pts), match/switch 4 (6 pts), loops 1 (2 pts) (nesting depth added 6). Of this number, 25 points are the body\u0027s own statements and 2 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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":1282}}}],"partialFingerprints":{"codehealthFindingId/v1":"5427deebbf9aeb6b399a98edbf594b2ab8bd0527fa0e9990101c0641ae4014dd"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::bind_single_name_assign (cognitive 27): BindingsBuilder::bind_single_name_assign has cognitive complexity 27 (threshold 15). Drivers by points: if/else 16 (18 pts), boolean chains 8, match/switch 1 (nesting depth added 2). 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":"pyrefly/lib/binding/target.rs"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39852701bd42d44ad6071f975558c6bf71eb97acba330f83bcd63c6bffac9e4"}},{"ruleId":"D2","level":"warning","message":{"text":"Scopes::look_up_name_for_read (cognitive 27): Scopes::look_up_name_for_read has cognitive complexity 27 (threshold 15). Drivers by points: if/else 12 (18 pts), boolean chains 6, match/switch 2 (3 pts) (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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":3424}}}],"partialFingerprints":{"codehealthFindingId/v1":"c711e4eb7811d8d0064dd8553df6d98973033febfad6eb3d92c20c27e86f4583"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::add_kwargs_completions (cognitive 27): Transaction::add_kwargs_completions has cognitive complexity 27 (threshold 15). Drivers by points: loops 3 (12 pts), if/else 3 (10 pts), match/switch 1 (5 pts) (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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f7b26baa1b21497c2884b897d17f3ba0690be26fb1c3a43b328d9a0332de87"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::add_inlay_hints_for_positional_function_args (cognitive 27): Transaction::add_inlay_hints_for_positional_function_args has cognitive complexity 27 (threshold 15). Drivers by points: if/else 6 (19 pts), loops 2 (7 pts), boolean chains 1 (nesting depth added 18). 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":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"6983176c82a2f652cc4da94642e40536aa4ff978ad0cf0fe91ad80a183d82f4d"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::find_definition_for_attribute_in_non_python_module (cognitive 27): Transaction::find_definition_for_attribute_in_non_python_module has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (19 pts), boolean chains 6, loops 1 (2 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":"pyrefly/lib/state/lsp/extra_extensions.rs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69189aac50bb7f8712b1ee64fe25e5131daff7f3923d802a0af425eb9c9590e"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::extract_function::extract_function_code_actions (cognitive 27): pyrefly::lib::state::lsp::quick_fixes::extract_function::extract_function_code_actions has cognitive complexity 27 (threshold 15). Drivers by points: if/else 12 (21 pts), boolean chains 4, loops 2 (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":"pyrefly/lib/state/lsp/quick_fixes/extract_function.rs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffcfa69eee1ab0f0ed429471bb22cdaae86ac89fb6818e48c0984905ea6cd9a3"}},{"ruleId":"D2","level":"warning","message":{"text":"relationship_resolver.resolve_relationships (cognitive 27): relationship_resolver.resolve_relationships has cognitive complexity 27 (threshold 15). Drivers by points: if/else 5 (15 pts), loops 6 (11 pts), boolean chains 1 (nesting depth added 15). 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":"scripts/issue_ranker/relationship_resolver.py"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddc5b19caef54fa3674c999006bf58902764be116d2774364ac344e5c99cc840"}},{"ruleId":"D2","level":"warning","message":{"text":"classifier._categorize_errors (cognitive 27): classifier._categorize_errors has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (23 pts), boolean chains 2, loops 2 (nesting depth added 14). 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":"scripts/primer_classifier/classifier.py"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"1042fcae03e7b5880df0c22d73c36635cd0fd7fe4be85f5d2e0dd0799b2d1467"}},{"ruleId":"D2","level":"warning","message":{"text":"DslValidator::validate_generator (cognitive 26): DslValidator::validate_generator has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (14 pts), match/switch 5 (6 pts), loops 4 (5 pts), boolean chains 1 (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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3284}}}],"partialFingerprints":{"codehealthFindingId/v1":"0614a504115dc253220519744629e30f1d79e45a7852759e1844f5b2059f392b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::calculate_class_tparams (cognitive 26): AnswersSolver::calculate_class_tparams has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (15 pts), match/switch 2 (5 pts), loops 3 (4 pts), boolean chains 2 (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":"pyrefly/lib/alt/class/tparams.rs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"132ee04464e9a95f499b8e326dd8f717a46b7f1ff6344fd3f39ba814c14477bb"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::infer_dataframe_dict_schema (cognitive 26): AnswersSolver::infer_dataframe_dict_schema has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (14 pts), match/switch 4 (9 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 9). 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1823}}}],"partialFingerprints":{"codehealthFindingId/v1":"e187bf973ad9651acd77eb412574604c76d8a18e1a7cb05cb769a2c0e62daa3f"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::validated_tparams (cognitive 26): AnswersSolver::validated_tparams has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (16 pts), match/switch 2 (6 pts), boolean chains 3, loops 1 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":2212}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c79ea5f9df571cfda816cbd4da66a12c978c55b9ab02e4d2f0302d88765429"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::call_typing_cast (cognitive 26): AnswersSolver::call_typing_cast has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (17 pts), match/switch 3 (6 pts), boolean chains 2, loops 1 (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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"5664491ef740b7a0baac73294974b1061811ead39e763892897cb93e2a83cdc9"}},{"ruleId":"D2","level":"warning","message":{"text":"Exports::invalid_dunder_all_entries (cognitive 26): Exports::invalid_dunder_all_entries has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (21 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 15). 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":"pyrefly/lib/export/exports.rs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d73003ae3e88b5e0c08377b1b24d89a85ea31e7eac4a4cceb69f802397f43c"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::report::pysa::ast_visitor::visit_statement (cognitive 26): pyrefly::lib::report::pysa::ast_visitor::visit_statement has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (21 pts), loops 2 (4 pts), match/switch 1 (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":"pyrefly/lib/report/pysa/ast_visitor.rs"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"36709e74864a7d565d339e4a932812b0dfcb9010036e38bf7cbcf7c22149a301"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::infer::format_hints (cognitive 26): pyrefly::lib::commands::infer::format_hints has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (18 pts), match/switch 2 (4 pts), boolean chains 3, loops 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":"pyrefly/lib/commands/infer.rs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"425b3de317b76a3b600451657b4a99ea012adf9f2a57aa75a823e17208d136ff"}},{"ruleId":"D2","level":"warning","message":{"text":"generate_release_notes._fix_bug_fix_count (cognitive 26): generate_release_notes._fix_bug_fix_count has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (19 pts), boolean chains 4, loops 3 (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":"scripts/generate_release_notes.py"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef27fe2a906f67766f54e18dd36bece6f90c5e08fb8bb32def00d69029593b6d"}},{"ruleId":"D2","level":"warning","message":{"text":"github_issues.fetch_issues (cognitive 26): github_issues.fetch_issues has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 4, loops 3 (4 pts) (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":"scripts/issue_ranker/github_issues.py"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"55605b4d62f02507b3d7c78f0804a6d460566b35f40132934592dd6e47653b77"}},{"ruleId":"D2","level":"warning","message":{"text":"stub_coverage.parse_stub (cognitive 26): stub_coverage.parse_stub has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (15 pts), boolean chains 10, loops 1 (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":"tensor-shapes/stub_coverage.py"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"c63f44e501a9a0137d12bfa16b0cafe8c977e7d950f399aa7f7062896f8071df"}},{"ruleId":"D2","level":"warning","message":{"text":"Value::compare (cognitive 25): Value::compare has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 8 (21 pts), if/else 3 (4 pts) (nesting depth added 14). 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":"crates/pyrefly_python/src/sys_info.rs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf3e3240567f16e52baffcd1902ac18803c3cb7f0dd28ad8f51629800d06c969"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::lookup_magic_dunder_attr1 (cognitive 25): AnswersSolver::lookup_magic_dunder_attr1 has cognitive complexity 25 (threshold 15). Drivers by points: if/else 5 (11 pts), boolean chains 9, match/switch 2 (3 pts), loops 1 (2 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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2169}}}],"partialFingerprints":{"codehealthFindingId/v1":"95935516cb356cb17ca05c482ec7458ba397474b3b09a8471b670ce502489307"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::expr_call_infer (cognitive 25): AnswersSolver::expr_call_infer has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 8, match/switch 3 (7 pts) (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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":2543}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d06693caed55a449e5644fcd3a437c48ecb825d17f39da2aba499b87cf9c33"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::inject_module_attrs (cognitive 25): AnswersSolver::inject_module_attrs has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 5 (11 pts), if/else 4 (9 pts), loops 2 (3 pts), boolean chains 2 (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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":2546}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea0945d8b469cea9fa024c6d4be3b74cf81ae7164d53facb01330e5fa7bf8ded"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::pydantic_config (cognitive 25): AnswersSolver::pydantic_config has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 8, match/switch 3 (6 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":"pyrefly/lib/alt/class/pydantic.rs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e557eed6ec668929cf118fbf9b533681908801cb77ab7ad27116c6db0ca8c05"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::dataframe_list_element_type (cognitive 25): AnswersSolver::dataframe_list_element_type has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (18 pts), loops 2 (3 pts), boolean chains 2, match/switch 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2114}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cb16bd2cb4ef5751d64bc2edb3e6ee7c631b0a00e2837e9ef2a4b58cadca244"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::extract_pydantic_config_dict (cognitive 25): BindingsBuilder::extract_pydantic_config_dict has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 7, loops 1 (2 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":"pyrefly/lib/binding/pydantic.rs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"7af18eb911006e4e7bc1818e004e4390eb29fab6b33923476cdf8513fce22bc9"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::bind_targets_with_value (cognitive 25): BindingsBuilder::bind_targets_with_value has cognitive complexity 25 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 3 (9 pts), boolean chains 2, match/switch 1 (nesting depth added 14). 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":"pyrefly/lib/binding/target.rs"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"76e93f251fe298d7d4b9dde376de6a1471f6499fd73dc431dab4b01bae8c9e12"}},{"ruleId":"D2","level":"warning","message":{"text":"ErrorCollector::collect_into (cognitive 25): ErrorCollector::collect_into has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (18 pts), match/switch 1 (4 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 15). 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":"pyrefly/lib/error/collector.rs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c123cef59c80bf677ea1ebe78c92371a0e6490f7c9f36bb2fff646eeadedbf"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::module::finder::find_import_with_mode (cognitive 25): pyrefly::lib::module::finder::find_import_with_mode has cognitive complexity 25 (threshold 15). Drivers by points: if/else 15, boolean chains 10. 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":"pyrefly/lib/module/finder.rs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"db0d8058627c86524203fc276822d233b4dca6176fa12fe748d1fdac5cc05b58"}},{"ruleId":"D2","level":"warning","message":{"text":"classifier._enforce_cross_project_consistency (cognitive 25): classifier._enforce_cross_project_consistency has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 5 (8 pts), boolean chains 2 (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":"scripts/primer_classifier/classifier.py"},"region":{"startLine":736}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3977eb75a6e55982ec4ebc35fb3d8f4ddbf0fbbd9538b1a8bce717bdc461bbe"}},{"ruleId":"D2","level":"warning","message":{"text":"primer_history.render_markdown (cognitive 25): primer_history.render_markdown has cognitive complexity 25 (threshold 15). Drivers by points: if/else 4 (10 pts), ternaries 4 (9 pts), loops 4 (6 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":"scripts/primer_history.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f38db8a1571d196aefbc80f9e0128be66a6f59535999afbe4ccb9cfecd4fce6"}},{"ruleId":"D2","level":"warning","message":{"text":"ResolvedTypeShapeDslProgram::evaluate_suite (cognitive 24): ResolvedTypeShapeDslProgram::evaluate_suite has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 5 (15 pts), if/else 2 (8 pts), loops 1 (nesting depth added 16). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6253}}}],"partialFingerprints":{"codehealthFindingId/v1":"16c4eed1be680c57fa8881717ccfcf4d14e50833b3a764d349091716a9a2cf1e"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::gufunc::parse_gufunc_signature (cognitive 24): pyrefly_types::gufunc::parse_gufunc_signature has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 8 (11 pts), if/else 7 (9 pts), boolean chains 2, loops 2 (nesting depth added 5). 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":"crates/pyrefly_types/src/gufunc.rs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"1169c9a01bb76519e3de49bfd40488af730429b5fd122fb58a69462d01784517"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::get_dataclass_fields (cognitive 24): AnswersSolver::get_dataclass_fields has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (18 pts), loops 3 (6 pts) (nesting depth added 14). 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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"d697a8666746706de5ccb443aab5e5cc0953ad3c15ccb651f4120c14629802fc"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::fill_in_field_keywords_from_function_signature (cognitive 24): AnswersSolver::fill_in_field_keywords_from_function_signature has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (13 pts), match/switch 2 (7 pts), boolean chains 2, loops 1 (2 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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":930}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2182d4689640fa6761c0fc6523a6fe609eaf2fb9c16238e2dc93e67186b734a"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::validate_self_annotation (cognitive 24): AnswersSolver::validate_self_annotation has cognitive complexity 24 (threshold 15). Drivers by points: if/else 5 (14 pts), boolean chains 4, loops 1 (4 pts), match/switch 1 (2 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2753}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a74253af5669371257a2e72f4890bdc8ee056e15a835b1a265bc02f6b4635f3"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::project_regular_nested_list (cognitive 24): AnswersSolver::project_regular_nested_list has cognitive complexity 24 (threshold 15). Drivers by points: if/else 5 (13 pts), match/switch 5 (10 pts), loops 1 (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":"pyrefly/lib/alt/regular_nested_list.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"f026737993fe95c37e498ef4b661be83ca269e2e11f938172cb80acd907e31a3"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::synthesize_collections_named_tuple_def (cognitive 24): BindingsBuilder::synthesize_collections_named_tuple_def has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (18 pts), loops 3 (4 pts), boolean chains 2 (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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":1262}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aaab6b15eb20dcab78623cc8f645b84a46578a8d7330118b2fc56748e931d61"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::function_body (cognitive 24): BindingsBuilder::function_body has cognitive complexity 24 (threshold 15). Drivers by points: boolean chains 10, if/else 9 (10 pts), match/switch 3 (4 pts) (nesting depth added 2). 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":"pyrefly/lib/binding/function.rs"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"38cd03f1dc9f6b27684f8b4d5c06e4659557ba4d5585e65b8bd5a43c0d297c4f"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::refine_keyword_argument_definition_for_class (cognitive 24): Transaction::refine_keyword_argument_definition_for_class has cognitive complexity 24 (threshold 15). Drivers by points: if/else 4 (13 pts), loops 4 (8 pts), match/switch 1 (2 pts), boolean chains 1 (nesting depth added 14). 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":1232}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae13b8bd697ebc327d8b34c32b715d1fcd815ebb0e193954e0f5c47af78094c"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::split_line_count (cognitive 24): Transaction::split_line_count has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (18 pts), loops 3 (6 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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be21f7a3c966f700e65ba1e832a5ed5bee66a5ada75fe0998e86940b46cad28"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::module::finder::resolve_third_party_stub (cognitive 24): pyrefly::lib::module::finder::resolve_third_party_stub has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (21 pts), boolean chains 3 (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":"pyrefly/lib/module/finder.rs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"9809dbace7a11992f65424caff05ab8bbfe84b9787af23ebd141dcca0b0ea221"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::module::finder::find_extra_extension_module (cognitive 24): pyrefly::lib::module::finder::find_extra_extension_module has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (19 pts), loops 3 (5 pts) (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":"pyrefly/lib/module/finder.rs"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8eee148d774b26486d28ad02e2eeb1401ce5cbd9624e809ef0c4fc780fcfc40"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::parse_instance_attrs (cognitive 24): pyrefly::lib::commands::coverage::collect::parse_instance_attrs has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (16 pts), match/switch 2 (4 pts), boolean chains 3, 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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d8d7d00659665fd943e254a28f709fff07ca58626fa359832c9bac81261c0d2"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::move_module::sibling_module_targets (cognitive 24): pyrefly::lib::state::lsp::quick_fixes::move_module::sibling_module_targets has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (19 pts), boolean chains 4, loops 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":"pyrefly/lib/state/lsp/quick_fixes/move_module.rs"},"region":{"startLine":799}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bb07d7173e27ebe5a1acd9976ba2d2817a07820d2d408c6c694d6aa5b3c02dc"}},{"ruleId":"D2","level":"warning","message":{"text":"generate_protocol.replace_flag_enum (cognitive 24): generate_protocol.replace_flag_enum has cognitive complexity 24 (threshold 15). Drivers by points: if/else 14 (20 pts), loops 3, 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":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":568}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a17f0c4472c8fe477865fabab17b3b2829a56ade235aa82a32e7a1565073dfe"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_python::docstring::parse_sphinx_params (cognitive 23): pyrefly_python::docstring::parse_sphinx_params has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (19 pts), match/switch 1 (3 pts), loops 1 (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":"crates/pyrefly_python/src/docstring.rs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1fe13349d556abef2e499ab96aa1d6d5a6cc6ce944ecdf1522cb05f197dbeb5"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::validate_dataclass_transform_defaults (cognitive 23): AnswersSolver::validate_dataclass_transform_defaults has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 14, if/else 7 (8 pts), match/switch 1 (nesting depth added 1). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1426}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f465a0e563014de17ab398ab0291be0bc09f7b50346a8c97d91f4577683bc2"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::resolve_class_attr_setter (cognitive 23): AnswersSolver::resolve_class_attr_setter has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (12 pts), match/switch 4 (8 pts), boolean chains 3 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5355}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcb68908de7228f7a789d0ba17a4f6d504cf299c2d4962a984bf3b1bab928e29"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::final_protocol_metadata (cognitive 23): AnswersSolver::final_protocol_metadata has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (18 pts), loops 2 (3 pts), match/switch 1 (2 pts) (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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":835}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aecb2352e236534e00de3d508a52cb53e2657a82885dfd0b0bde9fdd8053ac8"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::dataclass_from_dataclass_transform (cognitive 23): AnswersSolver::dataclass_from_dataclass_transform has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (21 pts), boolean chains 1, 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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1167}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4b76335eacb4751009d8c2574adec96d7bf4b22398f6781b2225073177cc7d"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::solve_super_binding (cognitive 23): AnswersSolver::solve_super_binding has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (16 pts), match/switch 4 (7 pts) (nesting depth added 11). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3437}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ea6e721bd031e483a6d9c8d39876d128159479db605c0aade6bc50384fa514"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::binding_to_type_return_explicit (cognitive 23): AnswersSolver::binding_to_type_return_explicit has cognitive complexity 23 (threshold 15). Drivers by points: if/else 17 (22 pts), boolean chains 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4217}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73f3101e692130c3df65e7d23c6d662e62954947a7d610e04a3394f2b9cd681"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_except_clause_reachability (cognitive 23): AnswersSolver::check_except_clause_reachability has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (13 pts), match/switch 4 (5 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 4). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4458}}}],"partialFingerprints":{"codehealthFindingId/v1":"5439df9ba2cc91b04c856a385b383512d8e418d0efedd94a111d847065754428"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::check_targs (cognitive 23): Subset::check_targs has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 7, match/switch 2 (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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":2963}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3767ec8dca75ecb669bdb6c70ba4e2ab6b9669909ad07157fabb5883c695ae3"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::add_local_variable_completions (cognitive 23): Transaction::add_local_variable_completions has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (16 pts), match/switch 1 (3 pts), boolean chains 2, loops 1 (2 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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"746877592be77a28c61939b7be5c56b0d1b56ced12e8e7fae218922a08d7754f"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::export::symbols::build (cognitive 23): pyrefly::lib::export::symbols::build has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (16 pts), loops 2 (4 pts), match/switch 1 (2 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":"pyrefly/lib/export/symbols.rs"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"3badd28f31ba3c0a5991cbb2351ba383cf4e7852eb13736c82ddbc1c179949e5"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::lsp::non_wasm::will_rename_files::will_rename_files (cognitive 23): pyrefly::lib::lsp::non_wasm::will_rename_files::will_rename_files has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (12 pts), match/switch 3 (6 pts), loops 3 (5 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":"pyrefly/lib/lsp/non_wasm/will_rename_files.rs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"77bce0f0f45759e6536fca58119406cd66f56156ad4a2ec591f9a95c50b1ab5c"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::dump_config::dump_config (cognitive 23): pyrefly::lib::commands::dump_config::dump_config has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 5 (7 pts), match/switch 1 (2 pts) (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":"pyrefly/lib/commands/dump_config.rs"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"e01cb957bedc7d157d19fc77e28bbaa09a7c49b95376f8d2e51a7c85b022eca9"}},{"ruleId":"D2","level":"warning","message":{"text":"classifier._format_errors_for_llm (cognitive 23): classifier._format_errors_for_llm has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (14 pts), loops 2 (4 pts), ternaries 1 (3 pts), boolean chains 2 (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":"scripts/primer_classifier/classifier.py"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"266e971be219976767771c482562697110141ba3ea95ceaafdc2d9c07a6065b5"}},{"ruleId":"D2","level":"warning","message":{"text":"formatter._build_high_level_summary (cognitive 23): formatter._build_high_level_summary has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 3 (6 pts), boolean chains 2 (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":"scripts/primer_classifier/formatter.py"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"1650c1a72f40be635751a28e45fb3068b608bc074dae798c981deeddf65327ca"}},{"ruleId":"D2","level":"warning","message":{"text":"extension.activate (cognitive 23): extension.activate has cognitive complexity 23 (threshold 15). Drivers by points: if/else 15, boolean chains 3, error handling 3, ternaries 1 (2 pts) (nesting depth added 1). Most of this is not in the body itself: 5 of the 23 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 454, 384, 409, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/extension.ts"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d58b9d7d5517b483e218c1a779f45a098fd9efcb9046d6c07b49dcdbf66e07b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::boolop (cognitive 22): AnswersSolver::boolop has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (12 pts), match/switch 2 (5 pts), loops 2 (3 pts), boolean chains 2 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":2353}}}],"partialFingerprints":{"codehealthFindingId/v1":"b25157e0b37de3eabda60cefe436ed532100a8532bda821bd48a70a33ce8859d"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::handle_special_import_call (cognitive 22): BindingsBuilder::handle_special_import_call has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 2 (5 pts), match/switch 2, boolean chains 1 (nesting depth added 10). 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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb7ffe56b0a8c69466911b8d087ea650916c10957cb05f072fc85af4a6be7ed4"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::get_diag_if_shown (cognitive 22): Server::get_diag_if_shown has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 7, match/switch 1 (3 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":3190}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1df205cc113ad3dabb69266136c04d8ccd375964e2925a951f68a41872eed87"}},{"ruleId":"D2","level":"warning","message":{"text":"RenameUsageVisitor::visit_stmt (cognitive 22): RenameUsageVisitor::visit_stmt has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (16 pts), match/switch 2 (4 pts), loops 1 (2 pts) (nesting depth added 11). 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":"pyrefly/lib/lsp/non_wasm/will_rename_files.rs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"43cb6695596abaa583a3d5876b36153c029d5ea487bd749cb69d16676ce7cd16"}},{"ruleId":"D2","level":"warning","message":{"text":"WorkspaceConfigConfigurer::configure (cognitive 22): WorkspaceConfigConfigurer::configure has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (19 pts), boolean chains 2, loops 1 (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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"64a62114046e3a8fcb52fd85a9bcf6c90cfefbebe35a778f626187156e03517e"}},{"ruleId":"D2","level":"warning","message":{"text":"Query::get_attributes (cognitive 22): Query::get_attributes has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (15 pts), match/switch 3 (5 pts), boolean chains 2 (nesting depth added 7). Of this number, 19 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":"pyrefly/lib/query.rs"},"region":{"startLine":1125}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f06a62b6ffee9d5ab8a5a0e7ef867265d5701c1640173a16c01e5bbce059b2b"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::is_subset_overload (cognitive 22): Subset::is_subset_overload has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 5 (12 pts), if/else 3 (5 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 11). 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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1590}}}],"partialFingerprints":{"codehealthFindingId/v1":"29bd65bf907ee9628df1e0f580cd169749b10c86c6da177f66b6c90a960e6e13"}},{"ruleId":"D2","level":"warning","message":{"text":"SemanticTokenBuilder::process_syntax_tokens (cognitive 22): SemanticTokenBuilder::process_syntax_tokens has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (16 pts), match/switch 2 (5 pts), loops 1 (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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6729bdbd5fe4fece52a1aa340c8ee428cee108e2085a5c547db8ff88c700a5e"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::infer_parameter_annotations (cognitive 22): Transaction::infer_parameter_annotations has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 2 (5 pts), match/switch 1 (2 pts) (nesting depth added 10). Most of this is not in the body itself: 8 of the 22 points are its own statements and the rest belongs to 2 function items inside it that branch (transpose, zip_types). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":733}}}],"partialFingerprints":{"codehealthFindingId/v1":"6225c7b0fd268051a0c14aa5ccadd07dd59edc478d5f840ae6dc7caacf3da827"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::dict_key_string_literal_at (cognitive 22): Transaction::dict_key_string_literal_at has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 4 (11 pts), if/else 3 (7 pts), boolean chains 3, loops 1 (nesting depth added 11). 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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a4b8de7c2fb95b6688ef0d021c7e9d06b00f3828002e6d3d44fa68c2f661754"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::alt::class::variance_inference::on_type (cognitive 22): pyrefly::lib::alt::class::variance_inference::on_type has cognitive complexity 22 (threshold 15). Drivers by points: loops 7 (16 pts), if/else 2 (3 pts), match/switch 2 (3 pts) (nesting depth added 11). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee4bec6f5ec3f3522afa0c6cd0c97196e4c1b6200d2f1507b9152aa063290335"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::introduce_parameter::build_callsite_edits (cognitive 22): pyrefly::lib::state::lsp::quick_fixes::introduce_parameter::build_callsite_edits has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (20 pts), boolean chains 1, 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":"pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4a5f0875b64bf3ffb30711689463b1318bbb7dbc9a9cfb483cd69f2cdab97c7"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::report::cinderx::convert::type_to_structured (cognitive 22): pyrefly::lib::report::cinderx::convert::type_to_structured has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 7 (13 pts), if/else 5 (8 pts), boolean chains 1 (nesting depth added 9). 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":"pyrefly/lib/report/cinderx/convert.rs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b924ff132842615727ccfef544d22aa839605ae084a55b904b3943b7a9227b3"}},{"ruleId":"D2","level":"warning","message":{"text":"issue_checker._run_all_checkers (cognitive 22): issue_checker._run_all_checkers has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (12 pts), boolean chains 9, loops 1 (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":"scripts/issue_ranker/issue_checker.py"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a24796f484ddba7c75c88caa802ef33beb367ad955acae47184b6fbcdda0ffc"}},{"ruleId":"D2","level":"warning","message":{"text":"classifier.classify_project (cognitive 22): classifier.classify_project has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 3, error handling 2, loops 1 (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":"scripts/primer_classifier/classifier.py"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e5a80400a8f662435dd93134788c2cee3b70aa851a14c8006be60236ed2ff99"}},{"ruleId":"D2","level":"warning","message":{"text":"llm_client.assign_verdict_with_llm (cognitive 22): llm_client.assign_verdict_with_llm has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 6 (7 pts), error handling 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":"scripts/primer_classifier/llm_client.py"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"65368a4480de2d83c88077a6dfbfce07910076299b4641ff52687e8829052662"}},{"ruleId":"D2","level":"warning","message":{"text":"QuerySourceDatabase::update_with_target_manifest (cognitive 21): QuerySourceDatabase::update_with_target_manifest has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (10 pts), loops 5 (9 pts), boolean chains 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":"crates/pyrefly_build/src/source_db/query_source_db.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"af5bd66c9a5aa1feb0e998462bdec4e260822adb73584ea2ffa630f5ccb9144f"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_config::migration::mypy::util::make_error_config (cognitive 21): pyrefly_config::migration::mypy::util::make_error_config has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 5, loops 2 (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":"crates/pyrefly_config/src/migration/mypy/util.rs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"94f7439599d54ad783a62b9c35852876f72cfa300e3089be526699d45d48f09b"}},{"ruleId":"D2","level":"warning","message":{"text":"ParamList::fmt_with_type (cognitive 21): ParamList::fmt_with_type has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 4, loops 2 (3 pts) (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":"crates/pyrefly_types/src/callable.rs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"3517bba4f2af4b2a7e87602c9a4f72bc44a38b8ec8686726c062ebc1095bd548"}},{"ruleId":"D2","level":"warning","message":{"text":"PolarsScalarDType::supertype (cognitive 21): PolarsScalarDType::supertype has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10, match/switch 4 (7 pts), boolean chains 4 (nesting depth added 3). 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":"crates/pyrefly_types/src/polars_dtype.rs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e22f4d7037dc6e8656dcdc2f969a8e28df74bea9cb405715844d64e820fdb2b"}},{"ruleId":"D2","level":"warning","message":{"text":"Tarjan::root (cognitive 21): Tarjan::root has cognitive complexity 21 (threshold 15). Drivers by points: if/else 3 (10 pts), match/switch 3 (6 pts), loops 2 (5 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":"crates/pyrefly_util/src/tarjan.rs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc31ca67a41ef928d345f48750af2c0633f9b4161dd1e8ae0c0d4ffb6f1dafde"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::iterative_resolve_scc (cognitive 21): AnswersSolver::iterative_resolve_scc has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 2 (3 pts), match/switch 1 (2 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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":3141}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa20a495e23964ea7f8d6eedaf5dc9ded24d5417e90baa4e5b7fdffc9ba057d2"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::constructor_to_callable (cognitive 21): AnswersSolver::constructor_to_callable has cognitive complexity 21 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 4 (nesting depth added 4). 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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":2411}}}],"partialFingerprints":{"codehealthFindingId/v1":"67fcfcf8fe273606f534a51aab69332ff2903a0f1f2e96fd6882b34b23b43ca4"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::bases_with_metadata (cognitive 21): AnswersSolver::bases_with_metadata has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 3, match/switch 1 (nesting depth added 7). 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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1811}}}],"partialFingerprints":{"codehealthFindingId/v1":"70fe71b6df4e63abe11086fb6775ae8dde08ac9cf4f6761d7970a7241cff0661"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::validate_frozen_dataclass_inheritance (cognitive 21): AnswersSolver::validate_frozen_dataclass_inheritance has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (19 pts), boolean chains 1, loops 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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":729}}}],"partialFingerprints":{"codehealthFindingId/v1":"8143bf4330b31def1a996ee3d6ffd0653f3ffa204fabde748a2b8684eb531234"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::iter_fields (cognitive 21): AnswersSolver::iter_fields has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (15 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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":1180}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4124df2c23cbd7370c4636194a7b81953710738ce36e639363ca93c0eecb039"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::narrow_issubclass (cognitive 21): AnswersSolver::narrow_issubclass has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (17 pts), loops 2 (4 pts) (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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":956}}}],"partialFingerprints":{"codehealthFindingId/v1":"70c4a3efd416010807d650920f4ed38bef162bdb27fc9deed3e0f0256620b1f2"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::augassign_infer (cognitive 21): AnswersSolver::augassign_infer has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (15 pts), boolean chains 4, match/switch 1 (2 pts) (nesting depth added 4). 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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3f99784619d5458df30efee696c06240cbef9e12899080d30e73a3153220915"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::polars_nested_dtype_from_call (cognitive 21): AnswersSolver::polars_nested_dtype_from_call has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (13 pts), match/switch 3 (5 pts), loops 1 (2 pts), boolean chains 1 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1156}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd03bd0029716cbe4e01cde54c7574311b2a1a838df78c9d9eb53e363beaf3dd"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::polars_group_by_agg (cognitive 21): AnswersSolver::polars_group_by_agg has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (12 pts), loops 6 (8 pts), match/switch 1 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2842}}}],"partialFingerprints":{"codehealthFindingId/v1":"61aa280920234dd6f854e90e5759ca0012f94dedd0cdcad059043ae3f15e7155"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::binding_to_type_return_type (cognitive 21): AnswersSolver::binding_to_type_return_type has cognitive complexity 21 (threshold 15). Drivers by points: if/else 13 (19 pts), boolean chains 1, match/switch 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4104}}}],"partialFingerprints":{"codehealthFindingId/v1":"15ad5ce7c37c8e4650570b650737865e834535e28a583787ffbd5b9f6e95ff7d"}},{"ruleId":"D2","level":"warning","message":{"text":"Linearization::new (cognitive 21): Linearization::new has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 2 (4 pts), boolean chains 3, match/switch 2 (3 pts) (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":"pyrefly/lib/alt/types/class_metadata.rs"},"region":{"startLine":1007}}}],"partialFingerprints":{"codehealthFindingId/v1":"785ef412c0dee5a3e1e0ec34615e4d46f27f91b7647bd963d1af1588dc5a2dc2"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::stmts (cognitive 21): BindingsBuilder::stmts has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 6, loops 1 (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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":1321}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d5c9eea75dfb35c3ba9d4abd9d47216a9ca7a3c294c498e718469967c4bae2f"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeCheckKind::format_error (cognitive 21): TypeCheckKind::format_error has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (12 pts), match/switch 6 (9 pts) (nesting depth added 7). 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":"pyrefly/lib/error/display.rs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cc16329c378ebb79740c3be51a2b06339aab91c84a0baf45a044a588bef9de5"}},{"ruleId":"D2","level":"warning","message":{"text":"Solver::erase_unsolved_variables (cognitive 21): Solver::erase_unsolved_variables has cognitive complexity 21 (threshold 15). Drivers by points: if/else 3 (9 pts), match/switch 3 (6 pts), loops 2 (5 pts), boolean chains 1 (nesting depth added 12). 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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06400ba2748f4b44c87ec7d6e40502e38e4e4b00dc44823fa8d0cb1d6c07b23"}},{"ruleId":"D2","level":"warning","message":{"text":"TspExtraConnection::run (cognitive 21): TspExtraConnection::run has cognitive complexity 21 (threshold 15). Drivers by points: if/else 3 (10 pts), match/switch 3 (9 pts), loops 2 (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":"pyrefly/lib/tsp/server.rs"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"a63fbd3ead6186a5a9c918fafc710eea82c0ace650cfdb550a56b48858b7aaeb"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::collect_class_members (cognitive 21): pyrefly::lib::commands::coverage::collect::collect_class_members has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (14 pts), loops 3 (7 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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":1229}}}],"partialFingerprints":{"codehealthFindingId/v1":"3efb8f4208c7c75bb923aaeb8cf6070e80ee7cd23c071d1fdd8d0268a6bd9f94"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::alt::jaxtyping::parse_shape_string (cognitive 21): pyrefly::lib::alt::jaxtyping::parse_shape_string has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 1 (3 pts), boolean chains 2, loops 1 (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":"pyrefly/lib/alt/jaxtyping.rs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec9cedf13d919e5df994e1d27086dea1a028ba18de514e1d3d4bd0db5a4cf630"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::error::signature_diff::render_signature_diff (cognitive 21): pyrefly::lib::error::signature_diff::render_signature_diff has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (18 pts), loops 2, boolean chains 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":"pyrefly/lib/error/signature_diff.rs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3c7ecae6df37a59fb906551abcc944df5dbc61ed61e2e052da2936edf73c03d"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::alt::functools::partial_params (cognitive 21): pyrefly::lib::alt::functools::partial_params has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 3 (5 pts), match/switch 1 (2 pts), boolean chains 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":"pyrefly/lib/alt/functools.rs"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4cc405ea2239d212f8860c8aba9ac2690dfec3004dbdf4fae84d671396fd0f0"}},{"ruleId":"D2","level":"warning","message":{"text":"SysInfo::subscript_tuple (cognitive 20): SysInfo::subscript_tuple has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (12 pts), match/switch 4 (7 pts), boolean chains 1 (nesting depth added 9). 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":"crates/pyrefly_python/src/sys_info.rs"},"region":{"startLine":1031}}}],"partialFingerprints":{"codehealthFindingId/v1":"95e5cc0da6cde06985e72b3cb61652f671ce9e4e95a7a4554d8b89259d22dada"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeDisplayContext::fmt_shape_as_tuple_carrier (cognitive 20): TypeDisplayContext::fmt_shape_as_tuple_carrier has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (14 pts), loops 2 (4 pts), boolean chains 1, match/switch 1 (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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dfaed413174940fc6ae50ec4e32bb09a5fc9e9e153e35612385d39ddaa65c11"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedIndexPlan::build (cognitive 20): AdvancedIndexPlan::build has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (14 pts), match/switch 2 (3 pts), boolean chains 2, loops 1 (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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"92b8fe307c9588727edd85262f4c9dc2ea07669fe2cb2ee1755dcd23546f2ad7"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::eval_binop (cognitive 20): pyrefly_types::meta_shape_dsl::eval_binop has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 10 (14 pts), if/else 2 (6 pts) (nesting depth added 8). 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2799}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f3a5e61ab7b4027a76f89fd3c93c748bd212d51d16a5bde621058341fdc9ab"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::calculate_and_record_answer_iterative (cognitive 20): AnswersSolver::calculate_and_record_answer_iterative has cognitive complexity 20 (threshold 15). Drivers by points: if/else 16 (19 pts), boolean chains 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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":2710}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f35ece3f66399630a930e45c2d1d5b3997212d84ac112a774f0bf93cd8dd96d"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::type_of_attr_get (cognitive 20): AnswersSolver::type_of_attr_get has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 4, loops 3, match/switch 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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed4bd0daafe56b7ab5624dfb5b3ec869f39607f097bcaef8c7ee641e4264046"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::create_next_typevartuple_arg (cognitive 20): AnswersSolver::create_next_typevartuple_arg has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (16 pts), match/switch 2 (3 pts), loops 1 (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":"pyrefly/lib/alt/class/targs.rs"},"region":{"startLine":576}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d63ea28f853e157848845ca6f8e0eedda45152b739a5232ce5d2bacdefd736b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::atomic_narrow_for_facet (cognitive 20): AnswersSolver::atomic_narrow_for_facet has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 4, match/switch 2 (3 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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1176}}}],"partialFingerprints":{"codehealthFindingId/v1":"a80bd5b226c7d4b822e27a582ac939e2efe63ca982518e9b973c20c8ed8b99ab"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::polars_output_count (cognitive 20): AnswersSolver::polars_output_count has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 5 (11 pts), if/else 3 (8 pts), boolean chains 1 (nesting depth added 11). 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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":2611}}}],"partialFingerprints":{"codehealthFindingId/v1":"9396f487ec8cc393c6e5a6700c976d05905c79bb10d668a620dd337cc2f44b88"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::populate_parent_methods_map (cognitive 20): AnswersSolver::populate_parent_methods_map has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (15 pts), loops 2 (4 pts), boolean chains 1 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3048}}}],"partialFingerprints":{"codehealthFindingId/v1":"9878ca521f52f2d42ac7cfb91417936556fb46bc42882e6dbf4d1204927c8585"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_variance_for_class (cognitive 20): AnswersSolver::check_variance_for_class has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 2 (4 pts), boolean chains 3 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3348}}}],"partialFingerprints":{"codehealthFindingId/v1":"50e4b98a960371b81d2eeda2c1f9e4553730b4d8d38db5cdd3de21fe57796607"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::solve_yield (cognitive 20): AnswersSolver::solve_yield has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (19 pts), match/switch 1 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6689}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef2de23e0f4a8a9ec01e997c9dd2c36443d99c21378eab309fbcc2163877869e"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::infer_unpacked_slice (cognitive 20): AnswersSolver::infer_unpacked_slice has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 3, match/switch 1 (nesting depth added 6). 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":"pyrefly/lib/alt/subscript.rs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d9cf32b90db1428cbe1df593e42c71d37fc373a77a4efc03f8195323ee6429e"}},{"ruleId":"D2","level":"warning","message":{"text":"BaselineIndex::apply (cognitive 20): BaselineIndex::apply has cognitive complexity 20 (threshold 15). Drivers by points: loops 5 (11 pts), if/else 3 (6 pts), match/switch 2, boolean chains 1 (nesting depth added 9). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/error/baseline.rs"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"a043ceb9520ddfd635a416b46653454d7e457eea60e1ebeac523a419e5f48ffe"}},{"ruleId":"D2","level":"warning","message":{"text":"Subset::is_subset_protocol_inner (cognitive 20): Subset::is_subset_protocol_inner has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 5, match/switch 1 (2 pts), loops 1 (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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":758}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b19c6972c53ae4e9ff543acdeb35674c1a3902b9722c08ca3f57d6a8c27405b"}},{"ruleId":"D2","level":"warning","message":{"text":"ImportTracker::resolve_annotation (cognitive 20): ImportTracker::resolve_annotation has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 2, match/switch 1 (2 pts), loops 1 (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":"pyrefly/lib/state/import_tracker.rs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"c50eb5c3b3d6162ae53310fe1e7d942b30ae92399b3683f6825566a7cdf8399e"}},{"ruleId":"D2","level":"warning","message":{"text":"ModuleChanges::overlaps (cognitive 20): ModuleChanges::overlaps has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 8, loops 1 (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":"pyrefly/lib/state/state.rs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef482d277548a509059b3edf431f7503cd9b4dbe09d23b3ca0b8013ce3eada8b"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::add_dict_key_completions (cognitive 20): Transaction::add_dict_key_completions has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 1 (3 pts), match/switch 2 (3 pts), boolean chains 2 (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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"327db25ca3c5148297a7060a9777daae760788b85042e63d9b2e0f36703a479e"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::move_module::make_local_function_top_level_code_actions (cognitive 20): pyrefly::lib::state::lsp::quick_fixes::move_module::make_local_function_top_level_code_actions has cognitive complexity 20 (threshold 15). Drivers by points: if/else 12 (17 pts), loops 1 (2 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":"pyrefly/lib/state/lsp/quick_fixes/move_module.rs"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"26fb29f5cfb813fe9f6daff73a5ccc2284f92b33edf7e1a8d46171a538da3a82"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::change_signature::build_callsite_edits (cognitive 20): pyrefly::lib::state::lsp::quick_fixes::change_signature::build_callsite_edits has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 1, loops 1 (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":"pyrefly/lib/state/lsp/quick_fixes/change_signature.rs"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cf295e51c506b545b16de511890975d541c6a675632a49a00eb945fdfd2619c"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::lsp::filter_unrecognized_lsp_args (cognitive 20): pyrefly::lib::commands::lsp::filter_unrecognized_lsp_args has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 3 (4 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":"pyrefly/lib/commands/lsp.rs"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"127afcbda2c39dd6c7d1ecc5dc9473ab960a3e0b930f27670fc53161e739595f"}},{"ruleId":"D2","level":"warning","message":{"text":"cross_checker._collect_checker_errors (cognitive 20): cross_checker._collect_checker_errors has cognitive complexity 20 (threshold 15). Drivers by points: if/else 6 (8 pts), ternaries 3 (8 pts), boolean chains 4 (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":"scripts/primer_classifier/cross_checker.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"8110c30979e87a35b8c8c4042825e9bb7c276cf206e9e3d4d87e0ccf2c06e377"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_build::module_resolver::find_module_prefixes (cognitive 19): pyrefly_build::module_resolver::find_module_prefixes has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (14 pts), match/switch 1 (3 pts), loops 1 (2 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":"crates/pyrefly_build/src/module_resolver.rs"},"region":{"startLine":841}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0a5caf7f30994d2979407ee0ca4f5e894377b37fc5d3e27134cec1eeb19bc98"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfigFile::query_source_db (cognitive 19): ConfigFile::query_source_db has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 4 (8 pts), match/switch 1 (2 pts) (nesting depth added 9). Of this number, 18 points are the body\u0027s own statements and 1 belongs 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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1470}}}],"partialFingerprints":{"codehealthFindingId/v1":"383fb387a6c5d74d5a8ee28b892550948bf8f2eacb75ccd4c57de87384d849bf"}},{"ruleId":"D2","level":"warning","message":{"text":"ConfigFile::from_file::f (cognitive 19): ConfigFile::from_file::f has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 3 (4 pts), boolean chains 1, loops 1 (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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1941}}}],"partialFingerprints":{"codehealthFindingId/v1":"75c526d6e3e71ef1229658e8761e305f34ce1546fdc35ea14b532fe2ceae959b"}},{"ruleId":"D2","level":"warning","message":{"text":"PyProject::update (cognitive 19): PyProject::update has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (17 pts), boolean chains 2 (nesting depth added 10). 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":"crates/pyrefly_config/src/pyproject.rs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d84b36a2be10342407e7bec4582f94a8d30212813a62a3d68dec3eec7f3b1eb"}},{"ruleId":"D2","level":"warning","message":{"text":"DslValidator::validate_dimension (cognitive 19): DslValidator::validate_dimension has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 5 (10 pts), if/else 5 (8 pts), boolean chains 1 (nesting depth added 8). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2492}}}],"partialFingerprints":{"codehealthFindingId/v1":"e82a84ec15b71d870152145e9056a1f7b6ef2a04cc94e566c75ddfdc04199db0"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::simplify::collapse_quantifieds (cognitive 19): pyrefly_types::simplify::collapse_quantifieds has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 3 (5 pts), match/switch 1 (2 pts) (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":"crates/pyrefly_types/src/simplify.rs"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"d11efcb16e013999da6f626eab67569bb431f0c160ee90080c9b5c4b9d9b5f64"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::einsum::evaluate_einops_einsum (cognitive 19): pyrefly_types::einsum::evaluate_einops_einsum has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 3 (8 pts), if/else 3 (5 pts), loops 3 (4 pts), boolean chains 2 (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":"crates/pyrefly_types/src/einsum.rs"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd724082f21a0f654a40cc2470f648887278f1389165b1a344daaa178de5fe05"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::shape_index::index_shape_multi (cognitive 19): pyrefly_types::shape_index::index_shape_multi has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 3, match/switch 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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":831}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8bc5b6d6a4a9ff88e6541477397dbc0af83a5e2d23b6575bb743d33a71ea147"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::type_level_dsl::lower_parameter (cognitive 19): pyrefly_types::type_level_dsl::lower_parameter has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 7 (17 pts), if/else 1 (2 pts) (nesting depth added 11). 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":8322}}}],"partialFingerprints":{"codehealthFindingId/v1":"27cc216db5c5672d2dd9fb69e11648190bfeb1080004d2585324ea2740ac3472"}},{"ruleId":"D2","level":"warning","message":{"text":"TaskHeap::work (cognitive 19): TaskHeap::work has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (14 pts), boolean chains 2, 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":"crates/pyrefly_util/src/task_heap.rs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"259f980634a3e364966afd7fb0280c3cd9afb42895498349d3c8e85bf7425262"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::record_attribute_definition_index (cognitive 19): AnswersSolver::record_attribute_definition_index has cognitive complexity 19 (threshold 15). Drivers by points: if/else 3 (10 pts), match/switch 2 (7 pts), loops 1 (2 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":"pyrefly/lib/alt/answers.rs"},"region":{"startLine":1739}}}],"partialFingerprints":{"codehealthFindingId/v1":"aff2c8fd7c34344098317107dd80e7d912523b9fec421b364695bd620ef93c0d"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::call_attrs_fields (cognitive 19): AnswersSolver::call_attrs_fields has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (11 pts), match/switch 2 (5 pts), boolean chains 3 (nesting depth added 9). 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":"pyrefly/lib/alt/class/attrs.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"afa3409fb851ee70b4070637ab2b202d922adc247527dfd6cf8e21f2374d1b14"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::create_next_typevar_arg (cognitive 19): AnswersSolver::create_next_typevar_arg has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (12 pts), match/switch 2 (5 pts), boolean chains 2 (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":"pyrefly/lib/alt/class/targs.rs"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"287794455fd3e068b04610ca5cc76bc176ca5649f63e94125edcb85de1f19833"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::typevartuple_from_call (cognitive 19): AnswersSolver::typevartuple_from_call has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 2 (5 pts), loops 1 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3061}}}],"partialFingerprints":{"codehealthFindingId/v1":"1500acd8e62c3267556f0cecd4bb0218a3e3a96eeef5c648cfadeaf30938c7b8"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_unnecessary_comparison (cognitive 19): AnswersSolver::check_unnecessary_comparison has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (18 pts), match/switch 1 (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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":1061}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9c6ca7a33971201f568b8cfca7a9d71afbc984e36f71cd5b76b2c3019625fa5"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::untype_opt_with_context (cognitive 19): AnswersSolver::untype_opt_with_context has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 2 (3 pts), loops 1 (2 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6962}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d82474c2e0100894a11e9c4599c9bcfb31ca448bc71f86c9b71a3f2836fb7e"}},{"ruleId":"D2","level":"warning","message":{"text":"ArgsExpander::expand_type (cognitive 19): ArgsExpander::expand_type has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (13 pts), match/switch 2 (3 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 9). 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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"fedcdec62b7530e5736d64d00dd3f31f284af6d3ba4c6e78eec9d8b4c9d1e8c1"}},{"ruleId":"D2","level":"warning","message":{"text":"Bindings::new (cognitive 19): Bindings::new has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (13 pts), loops 4, match/switch 1 (2 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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f5f4b793d958c28fb9585e6db486bf900517bf5dc6ecd3bbedf0eaed3596f30"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::bind_lambda (cognitive 19): BindingsBuilder::bind_lambda has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 4 (6 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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"945e0de75d1963af38e5cf7c9eaba5f370d2dbba124981585874ad5c876cbe88"}},{"ruleId":"D2","level":"warning","message":{"text":"Workspaces::apply_client_configuration (cognitive 19): Workspaces::apply_client_configuration has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (17 pts), boolean chains 1, match/switch 1 (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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"c09e0d00a72f681e8bb92d257f7fe8b28eb14f6059160256458359c8e1440d34"}},{"ruleId":"D2","level":"warning","message":{"text":"SemanticTokensLegends::convert_tokens_into_lsp_semantic_tokens (cognitive 19): SemanticTokensLegends::convert_tokens_into_lsp_semantic_tokens has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbf403ff6a2ec58eaf4fc3788194c9e8faadb2afdfff4b47b6be3d244264433e"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::type_from_resolution (cognitive 19): Transaction::type_from_resolution has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 2, match/switch 1 (nesting depth added 9). 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":1415}}}],"partialFingerprints":{"codehealthFindingId/v1":"04c0912caf63fb6984ae5f2f101dba34d40df1631f61db3229c7b5a2fc6ef842"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::lsp::non_wasm::document_symbols::recurse_stmt_adding_symbols (cognitive 19): pyrefly::lib::lsp::non_wasm::document_symbols::recurse_stmt_adding_symbols has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, loops 1 (2 pts), match/switch 2 (nesting depth added 6). 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":"pyrefly/lib/lsp/non_wasm/document_symbols.rs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cc9c363b1da88ce685c8e5f55067e8c97135e7fbe9ef98c5e7ec906cdbe5900"}},{"ruleId":"D2","level":"warning","message":{"text":"view_types.inline_type (cognitive 19): view_types.inline_type has cognitive complexity 19 (threshold 15). Drivers by points: if/else 13 (19 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":"pyrefly/lib/report/cinderx/view_types.py"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea8b748a2155580b1ca4e141109197bc2ca929fb28758d349567f8e1b8ff6c86"}},{"ruleId":"D2","level":"warning","message":{"text":"shape_testing.check_suites (cognitive 19): shape_testing.check_suites has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 3 (5 pts), boolean chains 1, ternaries 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":"tensor-shapes/shape_testing.py"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"0df439f73fb9620d6d623c36ff19affafbd394458b2b574778bd65a187178580"}},{"ruleId":"D2","level":"warning","message":{"text":"IgnoreMissingImports::migrate_from_mypy (cognitive 18): IgnoreMissingImports::migrate_from_mypy has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 3 (nesting depth added 2). 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":"crates/pyrefly_config/src/migration/ignore_missing_imports.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"26de98b821ce13fa15a67bbfbb179adcf90708083619f7aadfd21cc0cda77d82"}},{"ruleId":"D2","level":"warning","message":{"text":"Ignore::parse (cognitive 18): Ignore::parse has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 2 (3 pts), boolean chains 2 (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":"crates/pyrefly_python/src/ignore.rs"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"3efeda0b9e6f3c92032bf80c59424f64eccd08c14af9fcb8b49ffa745a7579af"}},{"ruleId":"D2","level":"warning","message":{"text":"Callable::fmt_with_type (cognitive 18): Callable::fmt_with_type has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (12 pts), match/switch 2 (3 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 10). 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":"crates/pyrefly_types/src/callable.rs"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c0b93c38225e5d528164a409e44637ed27650ab2405f9c3ec03d345e7ea8db6"}},{"ruleId":"D2","level":"warning","message":{"text":"PolarsDType::fmt (cognitive 18): PolarsDType::fmt has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (10 pts), loops 2 (5 pts), match/switch 2 (3 pts) (nesting depth added 11). 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":"crates/pyrefly_types/src/polars_dtype.rs"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"55514c958ebcb009860554ddf9ae2a25c847c1aaecd9adbd2be9e30e14c1d214"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::einsum::parse_einsum_equation (cognitive 18): pyrefly_types::einsum::parse_einsum_equation has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), match/switch 3 (6 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":"crates/pyrefly_types/src/einsum.rs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0169b0098720e975095001265f88bf2f8299b5f729f1260350a50a56b090933"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::meta_shape_dsl::bind_comp_vars (cognitive 18): pyrefly_types::meta_shape_dsl::bind_comp_vars has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 2 (5 pts), boolean chains 1, match/switch 1 (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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1878}}}],"partialFingerprints":{"codehealthFindingId/v1":"aca120def95674c63a2aee77e65aaad8275da890f062f13f25cbc14777b364e1"}},{"ruleId":"D2","level":"warning","message":{"text":"Answers::solve (cognitive 18): Answers::solve has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 2 (3 pts), match/switch 1 (3 pts), boolean chains 1 (nesting depth added 8). Of this number, 15 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":"pyrefly/lib/alt/answers.rs"},"region":{"startLine":1343}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea96e44d9c9bdea0dbae9f444b18a633e22f40d7c381301666d1e4054ad1e13"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::as_class_attribute_inner (cognitive 18): AnswersSolver::as_class_attribute_inner has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (9 pts), match/switch 4 (6 pts), boolean chains 3 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3665}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d09657757f729db8c4606808a230172ac4e5822611acccd47a2178cf4e89da0"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::paramspec_from_call (cognitive 18): AnswersSolver::paramspec_from_call has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (12 pts), match/switch 2 (5 pts), loops 1 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":2960}}}],"partialFingerprints":{"codehealthFindingId/v1":"c64997897ff72060212d428a4365e7f5b2460553404bb930af20174b2b7e9e0b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::binop_infer (cognitive 18): AnswersSolver::binop_infer has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 6 (nesting depth added 2). 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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"b94f7a121d1e9404761fffe57fdf16382bda2de589a714fb738c2991e9b3cbd5"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::binding_to_type_info_assign_to_subscript (cognitive 18): AnswersSolver::binding_to_type_info_assign_to_subscript has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 2, loops 1 (2 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":5616}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffc553480420fbc3c18f8e8059c9ad23f976c8fe9a594f8427992a865a28144f"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::resolve_type_shape_dsl_helpers (cognitive 18): AnswersSolver::resolve_type_shape_dsl_helpers has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 3 (9 pts), if/else 3 (7 pts), boolean chains 1, loops 1 (nesting depth added 10). 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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6efb0aa1e338f99aa81229cee628893ade4305cae5a74d1bb1e6b0b55d486e"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::insert_synthesized_fields (cognitive 18): BindingsBuilder::insert_synthesized_fields has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 4 (9 pts), if/else 3 (6 pts), boolean chains 2, loops 1 (nesting depth added 8). 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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"33ac70f966ceeb942e13faf6529895ae559eb7f166445b26e3223456b2c8ef85"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::merge_flow (cognitive 18): BindingsBuilder::merge_flow has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 6, if/else 6, loops 5 (6 pts) (nesting depth added 1). 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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":4118}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfae227b246fd389e872f0d6477196f168d3b9332c64e1b57ba288577e69d1c1"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::record_shape_function_metadata (cognitive 18): BindingsBuilder::record_shape_function_metadata has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (11 pts), match/switch 2 (4 pts), boolean chains 3 (nesting depth added 3). 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":"pyrefly/lib/binding/shape_type.rs"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"41e6cf6659d902a171a0c1b09848b880b5f8532eb343fae9d62d1fb088efc287"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::assign_type_var (cognitive 18): BindingsBuilder::assign_type_var has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 2, 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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"185f4bf7f559c8328682df33e852b0e5e68686e774b9e6be13c1fb3fa6bc2f77"}},{"ruleId":"D2","level":"warning","message":{"text":"PytestAliases::from_module (cognitive 18): PytestAliases::from_module has cognitive complexity 18 (threshold 15). Drivers by points: if/else 2 (8 pts), loops 3 (7 pts), match/switch 1 (2 pts), boolean chains 1 (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":"pyrefly/lib/binding/pytest.rs"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b6b77a285355222cc7744ddf3e0f2f51fbb250a33993c5644369e16433be971"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::did_close (cognitive 18): Server::did_close has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (8 pts), match/switch 3 (5 pts), loops 1 (3 pts), boolean chains 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4446}}}],"partialFingerprints":{"codehealthFindingId/v1":"abc1959853aa13b7751a9de61603c792dfa6fa214e1548693547ed260e27c110"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::async_go_to_implementations (cognitive 18): Server::async_go_to_implementations has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 3 (5 pts), boolean chains 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4828}}}],"partialFingerprints":{"codehealthFindingId/v1":"a483c41f566c1c4ba6ce8f9a275410356d115574c61f649f9031c76199f7893c"}},{"ruleId":"D2","level":"warning","message":{"text":"Query::find_imports::collect_attribute_prefixes (cognitive 18): Query::find_imports::collect_attribute_prefixes has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 1 (3 pts) (nesting depth added 10). 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":"pyrefly/lib/query.rs"},"region":{"startLine":1518}}}],"partialFingerprints":{"codehealthFindingId/v1":"a829e8ec947a5419833ee9b51f57f46ee2eecd1cfc07624c92401d0495eb8237"}},{"ruleId":"D2","level":"warning","message":{"text":"CallGraphVisitor::resolve_attribute_access (cognitive 18): CallGraphVisitor::resolve_attribute_access has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (10 pts), boolean chains 5, match/switch 2, 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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2639}}}],"partialFingerprints":{"codehealthFindingId/v1":"239696ec6e99e6e0ea8f8e670e790d746d5eeb54198f546afd810a5ec1548bbf"}},{"ruleId":"D2","level":"warning","message":{"text":"CallGraphVisitor::resolve_and_register_call (cognitive 18): CallGraphVisitor::resolve_and_register_call has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 9 (11 pts), boolean chains 7 (nesting depth added 2). 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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":3163}}}],"partialFingerprints":{"codehealthFindingId/v1":"40b28d84375cd61d391a79c4b52fed96981d5b40505c990668f1b639e621e10b"}},{"ruleId":"D2","level":"warning","message":{"text":"Solver::build_overload_rows (cognitive 18): Solver::build_overload_rows has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (9 pts), loops 3 (6 pts), match/switch 1 (2 pts), boolean chains 1 (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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1775}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c920932e7a3626257cf7f5ad34dc47230c8c25405ed374d66fc7a6554aaa1fd"}},{"ruleId":"D2","level":"warning","message":{"text":"ModuleDeps::invalidated_by (cognitive 18): ModuleDeps::invalidated_by has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 6, loops 1 (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":"pyrefly/lib/state/state.rs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aa6f5576bce117b304cbfeb594abf0a9e3b71d6c3d740e5939b9037259563e9"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::type_from_expression_at_impl (cognitive 18): Transaction::type_from_expression_at_impl has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (17 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":940}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5020bacdafef9e29e11611e00de90b8d663aa98d539a7833d236dea4385092a"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::resolve_named_import (cognitive 18): Transaction::resolve_named_import has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (12 pts), match/switch 2 (4 pts), boolean chains 1, 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":1658}}}],"partialFingerprints":{"codehealthFindingId/v1":"204d995443ae116c93589e00fcc2919756ed22eec943e89cd52091bce5076602"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::module::finder::combine_normal_and_stub_results (cognitive 18): pyrefly::lib::module::finder::combine_normal_and_stub_results has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 2, match/switch 1 (nesting depth added 7). 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":"pyrefly/lib/module/finder.rs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6db482c9fb5bca549d2a8420eeb99c571f2795158a398e1a003add1cf706841"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::compute_public_fqns (cognitive 18): pyrefly::lib::commands::coverage::collect::compute_public_fqns has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (13 pts), loops 2 (3 pts), boolean chains 2 (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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"280628949ea650e47583778872e711e31ca7d3234a06bcaf0db8b9aeaaa07925"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::find_global_references_from_definition_impl (cognitive 18): pyrefly::lib::state::lsp::find_global_references_from_definition_impl has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (12 pts), loops 3 (4 pts), boolean chains 2 (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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":5218}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf60309e0cb499260ff067949d0242977cc38a4baba5cab53e80a65773115744"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::inline_parameter::expand_range_to_remove_item (cognitive 18): pyrefly::lib::state::lsp::quick_fixes::inline_parameter::expand_range_to_remove_item has cognitive complexity 18 (threshold 15). Drivers by points: loops 4 (8 pts), boolean chains 6, if/else 3 (4 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":"pyrefly/lib/state/lsp/quick_fixes/inline_parameter.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fb4f5958214560a9034b8f64a9826f9c37b172ba9ec3ec81c4cb49710c4c97e"}},{"ruleId":"D2","level":"warning","message":{"text":"conformance_output.diff_expected_errors (cognitive 18): conformance_output.diff_expected_errors has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 4 (5 pts), boolean chains 2 (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":"conformance/conformance_output.py"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c544303ba4d9617d264427de3128fdf149940c18fc0a43de962afe66ef813e5"}},{"ruleId":"D2","level":"warning","message":{"text":"github_utils.display_contributors (cognitive 18): github_utils.display_contributors has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (13 pts), loops 2 (4 pts), ternaries 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":"scripts/github_utils.py"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"2822c91f9ebfc5ef599f67cea1e6dbafe98d09860f5d54d1c2ae13de8ae66ec6"}},{"ruleId":"D2","level":"warning","message":{"text":"__main__.main (cognitive 18): __main__.main has cognitive complexity 18 (threshold 15). Drivers by points: error handling 6 (10 pts), if/else 7, ternaries 1 (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":"scripts/primer_classifier/__main__.py"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a8e575496c0ba376809ba313b630876796a28fd3dcfc0fe508e4f005f2b524a"}},{"ruleId":"D2","level":"warning","message":{"text":"stub_coverage.collect (cognitive 18): stub_coverage.collect has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 3, error handling 1 (2 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":"tensor-shapes/stub_coverage.py"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"220c8cefb9f7db926ddea64657b202c346c49bd1c6fd5ee1d9981623f3993d2e"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_build::module_resolver::find_one_part (cognitive 17): pyrefly_build::module_resolver::find_one_part has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 5 (15 pts), if/else 1, loops 1 (nesting depth added 10). 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":"crates/pyrefly_build/src/module_resolver.rs"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"fada57721c672c6e17a3a5b59d70d6d700d5d97dbc2476744fe03d65717a806a"}},{"ruleId":"D2","level":"warning","message":{"text":"DslExpr::fmt (cognitive 17): DslExpr::fmt has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2 (4 pts), match/switch 1 (nesting depth added 9). 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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"76ca826d94a696f0a059089056da32b7c803a1c3e9be75f57e54f8c8ff2823ea"}},{"ruleId":"D2","level":"warning","message":{"text":"DslValidator::validate_assignment_value (cognitive 17): DslValidator::validate_assignment_value has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (14 pts), match/switch 2 (3 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3953}}}],"partialFingerprints":{"codehealthFindingId/v1":"e413226080c4d6e408a5fbf02606567d8a95664173c7cd1a5d64fa9bc8bf84d1"}},{"ruleId":"D2","level":"warning","message":{"text":"Solutions::changed_exports::check_table (cognitive 17): Solutions::changed_exports::check_table has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 2, match/switch 1 (2 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":"pyrefly/lib/alt/answers.rs"},"region":{"startLine":1042}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f2e2306ec1af262b6309fdf53300ce970a0b97915d9df37fb3f24e422e1be54"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::is_class_attribute_subset (cognitive 17): AnswersSolver::is_class_attribute_subset has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (12 pts), match/switch 2 (3 pts), boolean chains 2 (nesting depth added 6). 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5608}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddc4dba3206317995534a6af6bf3ae7e2476ce9974cb6a3b738660df92545fde"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_sqlalchemy_update_values_call (cognitive 17): AnswersSolver::check_sqlalchemy_update_values_call has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 1, 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1425}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e42c6089caf9cfc19ee5f9568225e1d7bda4a829170114f9707d85a63a3f0f7"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::parse_int_tuple_shape_args (cognitive 17): AnswersSolver::parse_int_tuple_shape_args has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 pts), match/switch 2 (6 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":5040}}}],"partialFingerprints":{"codehealthFindingId/v1":"373ed3a5a47ab55f33e39a9e9f253acac85bf41f985f5557da2a79e39093354a"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::decorate_returned_callable (cognitive 17): AnswersSolver::decorate_returned_callable has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 3, match/switch 3 (nesting depth added 5). 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":1791}}}],"partialFingerprints":{"codehealthFindingId/v1":"981938f6c0217d8f40c072c62f80158a2e6e561237c901f4087da170cc379182"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::polars_csv_options (cognitive 17): AnswersSolver::polars_csv_options has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), match/switch 3 (5 pts), boolean chains 1, loops 1 (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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1406}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a5ecdaa0769f5887163705d12d65d79a2e40cf7256a18d75ecc31b620a66d70"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::quantified_from_type_parameter (cognitive 17): AnswersSolver::quantified_from_type_parameter has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 2 (nesting depth added 2). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":2092}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc8cdf0ea5381b4be60c86fe5baaa6abb58f6eef9a66893650eac445e136b20e"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::solve_yield_from (cognitive 17): AnswersSolver::solve_yield_from has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (16 pts), match/switch 1 (nesting depth added 6). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6767}}}],"partialFingerprints":{"codehealthFindingId/v1":"c689bf252c4fba346abc6844656d234985b4f98cf6f60ca2aa3165708cbfe73d"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::finalize_bound_name (cognitive 17): BindingsBuilder::finalize_bound_name has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 3 (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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":1851}}}],"partialFingerprints":{"codehealthFindingId/v1":"f89e7340dbe96ff1f9c5670de8c825191c813352e46c182ab1e04b10786b4742"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::async_find_references_helper (cognitive 17): Server::async_find_references_helper has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (9 pts), loops 4 (7 pts), boolean chains 1 (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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":5382}}}],"partialFingerprints":{"codehealthFindingId/v1":"885ea92d040b2208ed57ce960a881c5ff94d8ac33b24a6fb31360bc0a906e357"}},{"ruleId":"D2","level":"warning","message":{"text":"GleanState::process_statement (cognitive 17): GleanState::process_statement has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (7 pts), loops 4 (7 pts), match/switch 2 (3 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":"pyrefly/lib/report/glean/convert.rs"},"region":{"startLine":1539}}}],"partialFingerprints":{"codehealthFindingId/v1":"461b03d4bb59b0198bb257d84881aab30cb6fa4d7e009eafcadf5c70316caa5f"}},{"ruleId":"D2","level":"warning","message":{"text":"SemanticTokenBuilder::process_expr (cognitive 17): SemanticTokenBuilder::process_expr has cognitive complexity 17 (threshold 15). Drivers by points: loops 4 (8 pts), if/else 3 (6 pts), match/switch 2 (3 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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"9867af1caa20492f47d90b97cdbcb0ea937f0155307095443b8247438ab1bcba"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::local_references_from_local_definition (cognitive 17): Transaction::local_references_from_local_definition has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), match/switch 2 (4 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":4182}}}],"partialFingerprints":{"codehealthFindingId/v1":"f74c0d0a21b53bac5fe693ffbb3b6e1328a4a38d011dce90bd0a209b7a342106"}},{"ruleId":"D2","level":"warning","message":{"text":"Transaction::local_attribute_references_from_local_definition (cognitive 17): Transaction::local_attribute_references_from_local_definition has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 7). Of this number, 14 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":4339}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45c6777804110dde05f052a6a78017f9557279dd4eadb24d7b231d31822603f"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::lsp::non_wasm::convert_module_package::convert_module_package_code_actions (cognitive 17): pyrefly::lib::lsp::non_wasm::convert_module_package::convert_module_package_code_actions has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (16 pts), match/switch 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":"pyrefly/lib/lsp/non_wasm/convert_module_package.rs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e65fd28b1740f9b74010c410026349d8e835cad3399cf4089a5b0fbd24e3dd6"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::commands::coverage::collect::build_module_report (cognitive 17): pyrefly::lib::commands::coverage::collect::build_module_report has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 5 (6 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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":1460}}}],"partialFingerprints":{"codehealthFindingId/v1":"c984e5777431b467435403ea7b75208bb2957423731da62b14422ba7d27da564"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::semantic_tokens::collect_disabled_ranges_from_stmt (cognitive 17): pyrefly::lib::state::semantic_tokens::collect_disabled_ranges_from_stmt has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 3 (6 pts), boolean chains 2, match/switch 1 (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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e9e435fa18523940d39acce9abe3eaea59e0b2cd68b345c0acd1ab1bf619af"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::inline_variable::inline_variable_code_actions (cognitive 17): pyrefly::lib::state::lsp::quick_fixes::inline_variable::inline_variable_code_actions has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13 (15 pts), boolean chains 1, loops 1 (nesting depth added 2). 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":"pyrefly/lib/state/lsp/quick_fixes/inline_variable.rs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d2fd3c8d8aed3568b8192e5c1607bc0b4097e51cea550d39359c660c65303fd"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::inline_variable::expand_statement_removal_range (cognitive 17): pyrefly::lib::state::lsp::quick_fixes::inline_variable::expand_statement_removal_range has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 5, 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":"pyrefly/lib/state/lsp/quick_fixes/inline_variable.rs"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"bec0890ca8808fb64b2ec50f8a68106c929caedaece636194881c8323bd22f82"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::convert_dict::suggest_base_name (cognitive 17): pyrefly::lib::state::lsp::quick_fixes::convert_dict::suggest_base_name has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 3, boolean chains 2, match/switch 1 (2 pts) (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":"pyrefly/lib/state/lsp/quick_fixes/convert_dict.rs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f7dd4af282b12ab8ce4769ed48fe30bae86382340b25d1c0ad2503b324f750"}},{"ruleId":"D2","level":"warning","message":{"text":"conformance_output.get_expected_errors (cognitive 17): conformance_output.get_expected_errors has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 4 (6 pts), boolean chains 1 (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":"conformance/conformance_output.py"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bae74376c0f15061d5a6aabadc24c4adfe3ee3e8c8b759a8eb7abf18bcf1ff3"}},{"ruleId":"D2","level":"warning","message":{"text":"llm_transport.call_anthropic_api (cognitive 17): llm_transport.call_anthropic_api has cognitive complexity 17 (threshold 15). Drivers by points: if/else 2 (6 pts), error handling 2 (4 pts), boolean chains 3, ternaries 1 (3 pts), loops 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":"scripts/llm_transport.py"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"07aba80db89064a8b81cc07cfda791ed8ac7efd946cb3bd4eadf10d002b0411f"}},{"ruleId":"D2","level":"warning","message":{"text":"code-lens.runTestAtLocation (cognitive 17): code-lens.runTestAtLocation has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 1 (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":"lsp/src/code-lens.ts"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"946b0b57c4d841cc6beadbdf06a52b782c411c94683db2dab2820844fea21fab"}},{"ruleId":"D2","level":"warning","message":{"text":"whyPyreflyGridItem.WhyPyreflyGridItem (cognitive 17): whyPyreflyGridItem.WhyPyreflyGridItem has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 10, ternaries 4, if/else 3. Most of this is not in the body itself: 2 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 86, 60, 71). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"website/src/components/landing-page/whyPyreflyGridItem.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"5598a6167ef8eab42b3e73bca99826b312fe1ea6872e6b0cc716a568f23dcedb"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_bundled::extract_files_from_archive (cognitive 16): pyrefly_bundled::extract_files_from_archive has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 2, 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":"crates/pyrefly_bundled/src/lib.rs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"928672d65bcb69c8f5fc42f8535b706fffd03bb456a1f77168215cdd57c5996c"}},{"ruleId":"D2","level":"warning","message":{"text":"Type::finalize_type_level_dsl_at_boundary (cognitive 16): Type::finalize_type_level_dsl_at_boundary has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (8 pts), match/switch 4 (7 pts), loops 1 (nesting depth added 6). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 3 function items inside it that branch (force_nested, collect_errors, force_nested::force_call). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/pyrefly_types/src/types.rs"},"region":{"startLine":1774}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8440283c76d8d5beaac113ba4a36193d266accdb00e960b156590a47af58bdc"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::gufunc::evaluate_gufunc (cognitive 16): pyrefly_types::gufunc::evaluate_gufunc has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 2 (3 pts), boolean chains 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":"crates/pyrefly_types/src/gufunc.rs"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"a54730bb505144412681021d5b0bb01fea14afa388ce6553df61bd4252c22738"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::shape_index::lower_integer_type (cognitive 16): pyrefly_types::shape_index::lower_integer_type has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (9 pts), match/switch 2 (4 pts), loops 1 (2 pts), boolean chains 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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b9566cab734168d26ad9f231c4482ba980f9c99436c4362aff131b0ba154319"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly_types::shape_index::lower_integer_tuple (cognitive 16): pyrefly_types::shape_index::lower_integer_tuple has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (9 pts), loops 2 (4 pts), if/else 2 (3 pts) (nesting depth added 7). 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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"a205d5b9c3fd7a41664fde303273d469237ea1ae485047952abb4b0f59392774"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::calculate_and_record_answer (cognitive 16): AnswersSolver::calculate_and_record_answer has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (14 pts), match/switch 1 (2 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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":2542}}}],"partialFingerprints":{"codehealthFindingId/v1":"682e0e6e9266ea98a9941947383a68ef12ce1591569e544c81d3c931180ad699"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::resolve_attr_setters (cognitive 16): AnswersSolver::resolve_attr_setters has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 3 (8 pts), if/else 2 (4 pts), loops 3, boolean chains 1 (nesting depth added 7). 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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":1140}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3129d8617519d358d30a54d706b0e8e846281ffd04c86a61ed3795480fe0375"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::apply_getattr_fallback (cognitive 16): AnswersSolver::apply_getattr_fallback has cognitive complexity 16 (threshold 15). Drivers by points: loops 3 (7 pts), if/else 4 (6 pts), boolean chains 3 (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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2295}}}],"partialFingerprints":{"codehealthFindingId/v1":"c536e90bb1ba8bdf09f542179d94e41aa8c4987072067de373ff9f338a0b55de"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::completions_mro (cognitive 16): AnswersSolver::completions_mro has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (9 pts), loops 2 (4 pts), match/switch 1 (2 pts), boolean chains 1 (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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":3201}}}],"partialFingerprints":{"codehealthFindingId/v1":"82cb0659eb34814d651a53a9170753fc1da1d71e3fdbbb8e5b203e4780e207c0"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::get_inherited_type_and_annotation (cognitive 16): AnswersSolver::get_inherited_type_and_annotation has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 1 (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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":2945}}}],"partialFingerprints":{"codehealthFindingId/v1":"c33341f8ca094e27a517baea70089f614cd0ca8739da0aa71fcfb54c1318b920"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::get_named_tuple_elements (cognitive 16): AnswersSolver::get_named_tuple_elements has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 3, boolean chains 2 (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":"pyrefly/lib/alt/class/named_tuple.rs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"43f889da25f21ba5e771bd84da7bcfa72a30344ea650caf9b25f95b9855b9f63"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::extract_root_model_inner_type (cognitive 16): AnswersSolver::extract_root_model_inner_type has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 1, match/switch 1 (nesting depth added 7). 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":"pyrefly/lib/alt/class/pydantic.rs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fca1bc8eaec109ff82052fffd72bc27aff17153fe822faec0bd4008a12dcd36"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::sentinel_from_call (cognitive 16): AnswersSolver::sentinel_from_call has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), match/switch 2 (5 pts), boolean chains 1, loops 1 (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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":2673}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f8804295be290fca8520d7cdaffe58b07f9ec76516d0f2699dd6b2b08c95d5c"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::get_requiredness (cognitive 16): AnswersSolver::get_requiredness has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (9 pts), match/switch 3 (5 pts), boolean chains 2 (nesting depth added 7). 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":1175}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b18cb144594795154d50033c36eafa4887bb493ce4878910f6fba9b72cdefe0"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::solve_annotation (cognitive 16): AnswersSolver::solve_annotation has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (12 pts), boolean chains 3, match/switch 1 (nesting depth added 7). 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1aca0a46aa69c67e561cbe5c10059786f7a81ca1246ac99bb3cfda2aca2b292"}},{"ruleId":"D2","level":"warning","message":{"text":"AnswersSolver::check_bool_expr_and_get_value (cognitive 16): AnswersSolver::check_bool_expr_and_get_value has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 3 (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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":2516}}}],"partialFingerprints":{"codehealthFindingId/v1":"68bbf5945e0dfa4a1a0b6649e28e9cf36901370b143099e8f0a9eecd8ea50326"}},{"ruleId":"D2","level":"warning","message":{"text":"AttrSubsetError::to_error_msg (cognitive 16): AttrSubsetError::to_error_msg has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (15 pts), match/switch 1 (nesting depth added 5). 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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb1c03be48d52608a0f0d43448c0e2a0a0cddcf532019252aa0ae302f51fe0d"}},{"ruleId":"D2","level":"warning","message":{"text":"BindingsBuilder::synthesize_typed_dict_def (cognitive 16): BindingsBuilder::synthesize_typed_dict_def has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), match/switch 3 (5 pts), boolean chains 1, 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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":1454}}}],"partialFingerprints":{"codehealthFindingId/v1":"c087c06b0e94bf50f6e8ba792ea0a99ffb9598b33053abc2a784c283ef8c3d53"}},{"ruleId":"D2","level":"warning","message":{"text":"Static::stmts (cognitive 16): Static::stmts has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 4 (5 pts), boolean chains 3 (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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"02aa1dc8fa4bc72433552c0630d1c91c1c9575c62916702c67ebe480883ab8c1"}},{"ruleId":"D2","level":"warning","message":{"text":"Expectation::parse (cognitive 16): Expectation::parse has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 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":"pyrefly/lib/error/expectation.rs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e7c7689fc63184b7d0f5ac2bc6e68a1a6174f5e2358bb2cbbc83bfdc8eca28"}},{"ruleId":"D2","level":"warning","message":{"text":"DefinitionsBuilder::resolve_module_entries (cognitive 16): DefinitionsBuilder::resolve_module_entries has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (11 pts), match/switch 1 (4 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":"pyrefly/lib/export/definitions.rs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"c78c875fa96d01d8b00508454082a02e628a9a10d7dbe1ab53ca0ed33d09122a"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::setup_file_watcher_if_necessary (cognitive 16): Server::setup_file_watcher_if_necessary has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 2 (4 pts), boolean chains 2, match/switch 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":6328}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff32f330d0ef80df51c2e7a2221019d9392c066a4dd20879be885977ec4908c1"}},{"ruleId":"D2","level":"warning","message":{"text":"Workspaces::update_workspace_config (cognitive 16): Workspaces::update_workspace_config has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (12 pts), match/switch 2 (4 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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":909}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a262fe0d07e5c6b8412f50aca0c1a20ad8c13c6894a662b298ab89435dc6cd7"}},{"ruleId":"D2","level":"warning","message":{"text":"GleanState::variable_facts (cognitive 16): GleanState::variable_facts has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), loops 2 (7 pts), boolean chains 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":"pyrefly/lib/report/glean/convert.rs"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"433178c77289de2dc99c46b9c022b9814b996728acec2fbf684dc25ccf7d9ba0"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::alt::class::variance_inference::on_class (cognitive 16): pyrefly::lib::alt::class::variance_inference::on_class has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (9 pts), boolean chains 3, loops 2, match/switch 1 (2 pts) (nesting depth added 6). Of this number, 15 points are the body\u0027s own statements and 1 belongs 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":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c51cae1698e6d91ff528eb0a1aa53832456334e0f83847e9b117c7b2d7c6542"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::lsp::wasm::hover::get_hover_with_verbosity (cognitive 16): pyrefly::lib::lsp::wasm::hover::get_hover_with_verbosity has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9, boolean chains 5, match/switch 2. 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":"pyrefly/lib/lsp/wasm/hover.rs"},"region":{"startLine":930}}}],"partialFingerprints":{"codehealthFindingId/v1":"73ef287d2577aaacb535b4b92f517a3c1e271db401d383502f9444146d9ca074"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::introduce_parameter::build_parameter_insertion (cognitive 16): pyrefly::lib::state::lsp::quick_fixes::introduce_parameter::build_parameter_insertion has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 2, match/switch 2 (nesting depth added 3). 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":"pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed9960c7ddba9a2ce5fa03a123eb90933572dfa1097c8a2ac6d5580f90ff9f46"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::state::lsp::quick_fixes::inline_variable::find_simple_assignment::find_in_stmts (cognitive 16): pyrefly::lib::state::lsp::quick_fixes::inline_variable::find_simple_assignment::find_in_stmts has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (12 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (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":"pyrefly/lib/state/lsp/quick_fixes/inline_variable.rs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c22465a387c0979dc45160668a3957d977f93be82035bd5f9a1dab3bd29694e"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::lsp::wasm::completion::assign_sort_text (cognitive 16): pyrefly::lib::lsp::wasm::completion::assign_sort_text has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 2 (3 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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"eceb1d0446e173af65f8915b0b92ed6b4d29b70ea830da75a48239875dffcda1"}},{"ruleId":"D2","level":"warning","message":{"text":"pyrefly::lib::lsp::non_wasm::server::initialize_start (cognitive 16): pyrefly::lib::lsp::non_wasm::server::initialize_start has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (13 pts), match/switch 1 (2 pts), loops 1 (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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1271}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ce9f666e7bf7bbdccc2e68f8c83901e41d5b2e730ba415f20cee1743758af8f"}},{"ruleId":"D2","level":"warning","message":{"text":"view_types.format_type (cognitive 16): view_types.format_type 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":"pyrefly/lib/report/cinderx/view_types.py"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"36cf96061d381c1bf37dcbf03d8c9adec2e88b171cef6bb95bcf3e08ddfedf78"}},{"ruleId":"D2","level":"warning","message":{"text":"compare_typecheckers.main (cognitive 16): compare_typecheckers.main has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (14 pts), ternaries 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":"scripts/compare_typecheckers.py"},"region":{"startLine":821}}}],"partialFingerprints":{"codehealthFindingId/v1":"40adcc3b12d5a1aca1a77b56599f484214ce949fdfe68179c7c6140825e6c897"}},{"ruleId":"D2","level":"warning","message":{"text":"llm_client.critique_reasoning (cognitive 16): llm_client.critique_reasoning has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 1 (3 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":"scripts/primer_classifier/llm_client.py"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"91bb4257c20ed28782a14e5145f3309dcb66c364e848da7d5c2a2c1527b86ab4"}},{"ruleId":"D2","level":"warning","message":{"text":"stub_coverage.stub_exports (cognitive 16): stub_coverage.stub_exports has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 2 (4 pts), ternaries 1 (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":"tensor-shapes/stub_coverage.py"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"579be07110d4dd4e195a7836d54fd50fc045b70b56424dbd5af9245fa7831c69"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AnswersSolver: TooManyMethods \u2014 1175 methods, declared across 49 files: alt/solve.rs (147), alt/expr.rs (103), class/class_field.rs (94), alt/answers_solver.rs (89), \u002B45 more file(s). The bar is 30 methods; this is 1145 over it, 39.17\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. 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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":2070}}}],"partialFingerprints":{"codehealthFindingId/v1":"e07602d4381f2a4a5fbb59d51492633828c6ae86e0f0e2abc661e5771b4de76f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/type_level_dsl.rs: FileTooLong \u2014 5941 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 5441 over it, 11.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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b03e86b74bf2d79ba61dc3ae584e8afd4f52908b582502d4c8377b44b5c890"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/solve.rs: FileTooLong \u2014 5146 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 95% of them inside a single declaration: AnswersSolver (324-7574). The bar is 500 significant lines; this is 4646 over it, 10.29\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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e0949b5e6eb8127746e195a46d781924ee2dba8f11f90a1a1959427878d50c2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: non_wasm/server.rs: FileTooLong \u2014 4963 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 78% of them inside a single declaration: Server (3 blocks, 1112-7419). The bar is 500 significant lines; this is 4463 over it, 9.93\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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f5bc93d29de14c91427157a13fbce1cbee2a5feaf3041c52a7130991c19efc"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Server: ClassTooLong \u2014 3894 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), 111 methods, 3 blocks, lines 1112-7419. The bar is 400 significant lines; this is 3494 over it, 9.74\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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1112}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f252ecb5410a08721de8566cdbc7842b72ee38773a486ae3efbec9128a06958"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Transaction: TooManyMethods \u2014 289 methods, declared across 13 files: state/lsp.rs (115), state/state.rs (84), lsp/dict_completions.rs (29), wasm/completion.rs (22), \u002B9 more file(s). The bar is 30 methods; this is 259 over it, 9.63\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. 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":"pyrefly/lib/state/state.rs"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"142f80c374bdb3d43f2a1f404dcf0413617ee89d5cfc237dc9b47f8bccaba35d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: class/class_field.rs: FileTooLong \u2014 4063 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 77% of them inside a single declaration: AnswersSolver (1425-6045). The bar is 500 significant lines; this is 3563 over it, 8.13\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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9eded12c2cec991d250e9c91dae1fc5653d0cc595aae27cc81a694e0654ab9a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.stmt_impl: MethodTooLong \u2014 stmt_impl runs 799 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 699 over it, 7.99\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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":847}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dfb5c228c3f2fd77413fe8047315f3873e5395a9585cdefdc61745ab6b11c5c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/expr.rs: FileTooLong \u2014 3844 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 92% of them inside a single declaration: AnswersSolver (429-5472). The bar is 500 significant lines; this is 3344 over it, 7.69\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66bec2daeec1adb90d56582a748e06918ee906c91dec0e1e94dd8a0c0efd557a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.callable_infer_params: MethodTooLong \u2014 callable_infer_params runs 758 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 658 over it, 7.58\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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"f892c5162bfd6b8cda4506c8363414c078dd5f9ac9cf8fc30f1240839b44111f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: state/lsp.rs: FileTooLong \u2014 3634 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 78% of them inside a single declaration: Transaction (3 blocks, 829-5316). The bar is 500 significant lines; this is 3134 over it, 7.27\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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce9ff12986f7aa37ed3d0e783194d6ff383a225cf578bea9bcd891453880878a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Subset.is_subset_eq_no_recursive_check: MethodTooLong \u2014 is_subset_eq_no_recursive_check runs 701 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 601 over it, 7.01\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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1877}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b99536bb7effe9e698df7f15354555842bd8cdc757db31eee6f2c4366f5ce70"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BindingsBuilder: TooManyMethods \u2014 210 methods, declared across 13 files: binding/bindings.rs (77), binding/class.rs (22), binding/expr.rs (21), binding/stmt.rs (20), \u002B9 more file(s). The bar is 30 methods; this is 180 over it, 7.00\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. 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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a8d8ca655444a9f65783bbf82b0fd47a7499587336ae72868c666d67dc6dcf7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.calculate_class_field: MethodTooLong \u2014 calculate_class_field runs 662 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 562 over it, 6.62\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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1524}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd84de9bac344e0f2b9c7e13239e68f63a91da091a58f25b0e111fb9a193bca"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: StructurallyValidatedTypeShapeDslFunction.evaluate_expression: MethodTooLong \u2014 evaluate_expression runs 620 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 520 over it, 6.20\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6770}}}],"partialFingerprints":{"codehealthFindingId/v1":"96a03523e212a65418537a2e56ed6c049862e6252dd72e9e19b7024748f47b6f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pysa/call_graph.rs: FileTooLong \u2014 3018 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 68% of them inside a single declaration: CallGraphVisitor (3 blocks, 1497-4459). The bar is 500 significant lines; this is 2518 over it, 6.04\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7f13ef6ba59736ec9fefd0c295507427efe397c23498ebd8f4193362d4871f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Server.process_event: MethodTooLong \u2014 process_event runs 598 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 498 over it, 5.98\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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":2054}}}],"partialFingerprints":{"codehealthFindingId/v1":"62e633cdd942efb9110f72fffc15a8f413f135d4599346f70b0ca0725f7e1fc4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TypeDisplayContext.fmt_helper_generic: MethodTooLong \u2014 fmt_helper_generic runs 581 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 481 over it, 5.81\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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"5461dde174330f617bf68ce53aae77b54f33bc1fea66ad7eb9084b05937742fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: solver/solver.rs: FileTooLong \u2014 2654 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 2154 over it, 5.31\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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"76aea03e3e4ce1e6bf8b43e3122edd4692cd1922143816d848f6049ede325355"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CallGraphVisitor: ClassTooLong \u2014 2043 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), 48 methods, 3 blocks, lines 1497-4459. The bar is 400 significant lines; this is 1643 over it, 5.11\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":1497}}}],"partialFingerprints":{"codehealthFindingId/v1":"a002f08ceaf8b2a27ce0389c7952022448009b0d4b1d3aac4161d914929803fb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.validate_type_shape_dsl_declaration: MethodTooLong \u2014 validate_type_shape_dsl_declaration runs 493 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 393 over it, 4.93\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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"c906e6a18c94a141ff512cad72a930781b74e2d5ae4b900cf6082197dd2c3ff2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/scope.rs: FileTooLong \u2014 2457 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 1957 over it, 4.91\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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6bb0fdb12f4d944b43eb13782386e7218335be9e40ac1eeeba3d149347a2ed9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/polars_specials.rs: FileTooLong \u2014 2448 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 71% of them inside a single declaration: AnswersSolver (1025-3506), declaring 35 free functions. The bar is 500 significant lines; this is 1948 over it, 4.90\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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af36517378b54c4606ce2bc9cb0079def99b059db85e017c6e24b77e8ad44c36"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/meta_shape_dsl.rs: FileTooLong \u2014 2422 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 52 free functions. The bar is 500 significant lines; this is 1922 over it, 4.84\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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b56db5cd30839b307901b6ff0040e11515a9b9a2f19057f78949aa459a97a792"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: state/state.rs: FileTooLong \u2014 2304 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 1804 over it, 4.61\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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f0e10957da7988fb068e65c24a142b6d24773dd97d487709a765ccdbae87fc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/binding.rs: FileTooLong \u2014 2296 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 1796 over it, 4.59\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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89c60d206aaddaadeb358f26350f45968af7fad59a592770a1c01efbaba29bc2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: solver/subset.rs: FileTooLong \u2014 2292 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 94% of them inside a single declaration: Subset (209-3476). The bar is 500 significant lines; this is 1792 over it, 4.58\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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"418ee2dfe0e38a2ea9f480741fd9519801b4100ced1c81fc5a651d41d49291c3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/attr.rs: FileTooLong \u2014 2268 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 83% of them inside a single declaration: AnswersSolver (2 blocks, 619-3507). The bar is 500 significant lines; this is 1768 over it, 4.54\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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75bd30bbb2870297ec1c7926cb4c9fbc5cf10c9954f506e5fbceb2fde4e2bcf6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/call.rs: FileTooLong \u2014 2203 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 91% of them inside a single declaration: AnswersSolver (281-3016). The bar is 500 significant lines; this is 1703 over it, 4.41\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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"90c8effd4d027a7a4f40bf159366699f3a4a1445dc70495f84a57f66baf2a4f3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.subscript_infer_for_type_with_key_present_inner: MethodTooLong \u2014 subscript_infer_for_type_with_key_present_inner runs 440 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 340 over it, 4.40\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3367}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f774cf0ca8fb7ebbb7d08cf470fc62349643b911129981bda001380861e09c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Scopes: TooManyMethods \u2014 131 methods. The bar is 30 methods; this is 101 over it, 4.37\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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":1597}}}],"partialFingerprints":{"codehealthFindingId/v1":"a54df94bddd5dafe250ad7d605171647168495e06697a8d6874eb8393a79e09e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/answers_solver.rs: FileTooLong \u2014 2120 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 1620 over it, 4.24\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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aa8517dcd5b1e4f3a47031859fef33712b9b751c6d6e6d8276152cc06eab679"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.bind_pattern: MethodTooLong \u2014 bind_pattern runs 407 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 307 over it, 4.07\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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7b2d798d53f53fc547a94c897a035f219866696215e5b1b5629207fc4ad910f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/function.rs: FileTooLong \u2014 2021 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 90% of them inside a single declaration: AnswersSolver (262-2899). The bar is 500 significant lines; this is 1521 over it, 4.04\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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"140619240a93cbc59298246feea2def05f8d8dc3b5f388f63661928c8e0adeec"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Type: TooManyMethods \u2014 112 methods, declared across 3 files: src/types.rs (99), src/boundary.rs (9), src/display.rs (4). The bar is 30 methods; this is 82 over it, 3.73\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. 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":"crates/pyrefly_types/src/types.rs"},"region":{"startLine":890}}}],"partialFingerprints":{"codehealthFindingId/v1":"157b076abf7603812947bd74bc19ac54370fdb298db49a8a0ce913b740362329"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Server: TooManyMethods \u2014 111 methods. The bar is 30 methods; this is 81 over it, 3.70\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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1112}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb037a9b83aabc5c764e50f21dd3a62ebf9cc58056d36bc9ee081d2dcbaefce"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/callable.rs: FileTooLong \u2014 1828 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 71% of them inside a single declaration: AnswersSolver (790-2663). The bar is 500 significant lines; this is 1328 over it, 3.66\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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1a508dbbd8e86bde411b3e5dcb8c83273e23afac1dffb32cc39f2f91b820b8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.expr_infer_impl_helper: MethodTooLong \u2014 expr_infer_impl_helper runs 363 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 263 over it, 3.63\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":574}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e3d8a9fc588dd380ac4b4824deb0c4d1a3645a02744de24a8a0ec276317b9f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DslValidator.validate_condition: MethodTooLong \u2014 validate_condition runs 357 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 257 over it, 3.57\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":4461}}}],"partialFingerprints":{"codehealthFindingId/v1":"c069db64579cdff795fc3cc41c0d7f6ec549dc1efeb527833d0889698ca61c58"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/narrow.rs: FileTooLong \u2014 1770 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 95% of them inside a single declaration: AnswersSolver (123-2659). The bar is 500 significant lines; this is 1270 over it, 3.54\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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39321983c025c7036a3279f223dfaf269f11ff5def692acc9db345aa154723ae"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/bindings.rs: FileTooLong \u2014 1759 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 62% of them inside a single declaration: BindingsBuilder (5 blocks, 286-2925). The bar is 500 significant lines; this is 1259 over it, 3.52\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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17168a3664c33202fd46171b13d84b268a2fd476eba426690c7f9566fbd5e969"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: StructurallyValidatedTypeShapeDslFunction: ClassTooLong \u2014 1377 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), 18 methods, 8 blocks, lines 922-8233. The bar is 400 significant lines; this is 977 over it, 3.44\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":922}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d7ca021e79acc7557ca142e3478d9edf5881a0934eaf8daa3e82f16bdeb8669"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.atomic_narrow: MethodTooLong \u2014 atomic_narrow runs 340 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 240 over it, 3.40\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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1352}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe15db19677a62b0b98f8812a3e00897590107247b0c40f89ff55580ca622315"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.as_call_target_impl: MethodTooLong \u2014 as_call_target_impl runs 334 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 234 over it, 3.34\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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"27af1e7863dce0204afa4276a7e4da0037cb293afdb4c7b998c93a8cbaf73bc0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.ensure_expr: MethodTooLong \u2014 ensure_expr runs 331 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 231 over it, 3.31\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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0dfb9bb9bbb85942a90a4d2be7cc19d889b2f72ab164aa7c5314f9c884daf56"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: class/class_metadata.rs: FileTooLong \u2014 1649 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 93% of them inside a single declaration: AnswersSolver (145-2362). The bar is 500 significant lines; this is 1149 over it, 3.30\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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3f3656b3fc9971bad846bba10e08f058c5a7d2a40338390048c46913c42fbae"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Solver: ClassTooLong \u2014 1310 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), 76 methods, 3 blocks, lines 545-2630. The bar is 400 significant lines; this is 910 over it, 3.28\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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"4291fd63df3b8ee1a10fb2ed653154912cb9db5ac683cbff5c0e1f255dbcf542"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/check.rs: FileTooLong \u2014 1631 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 1131 over it, 3.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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"67f9b88f6470170a29b7f2fda03dde82cb1d2a6d98a6de994f6ca8ff1da5b046"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Subset.is_subset_eq_var: MethodTooLong \u2014 is_subset_eq_var runs 325 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 225 over it, 3.25\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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3727}}}],"partialFingerprints":{"codehealthFindingId/v1":"42218e8baf95ff5dd3c5991c391b1e2bc93319d2bb8423632328ed8ce490f075"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.class_metadata_of: MethodTooLong \u2014 class_metadata_of runs 322 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 222 over it, 3.22\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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b7a3dfa22138994f2390e746947e182203938d5494400b7708d53df6f0d4ed8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: StructurallyValidatedTypeShapeDslFunction.evaluate_condition: MethodTooLong \u2014 evaluate_condition runs 321 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 221 over it, 3.21\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7795}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee0fdd246d7b9d998d35e44999c96ca32446309022aff6b174f7fe91814274d9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Transaction.find_definition: MethodTooLong \u2014 find_definition runs 318 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 218 over it, 3.18\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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2676}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6fece7720c794dba67b8610d1924e6dc10eb5b7a6c60eb872d83167be0d7ede"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.check_consistent_override_for_field: MethodTooLong \u2014 check_consistent_override_for_field runs 305 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 205 over it, 3.05\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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":4060}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b90cf51bd7eb2ae0916fbae10e5e9e6fb0a32071bd2ceb0100fc5369dc47336"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scripts/projects.py: FileTooLong \u2014 1517 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1017 over it, 3.03\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":"scripts/projects.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"338b66628a1b7a4a76d8b6fa48319bbb2c0a423020ba49199a85b75f96cc77f5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Transaction: ClassTooLong \u2014 1198 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), 289 methods, 2 blocks, lines 746-2735. The bar is 400 significant lines; this is 798 over it, 3.00\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":"pyrefly/lib/state/state.rs"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"06c9c1c030418b8296a9b61d5503edf904173dfd314f853ffdb01f3f9a621af3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CheckArgs.finish_cli_run: MethodTooLong \u2014 finish_cli_run runs 293 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 193 over it, 2.93\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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":1893}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b7c1a4b2ff4483da4f9d646ddb9d19982dfb003707d8a1222eeb5759fc244d7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DefinitionsBuilder.stmt: MethodTooLong \u2014 stmt runs 283 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 183 over it, 2.83\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":"pyrefly/lib/export/definitions.rs"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf4ad1d2d13065bd7138457fb798d993e01e9bd3cee62c5afec0a0de62b803e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Scopes: ClassTooLong \u2014 1126 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), 131 methods, 2 blocks, lines 1597-3661. The bar is 400 significant lines; this is 726 over it, 2.82\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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":1597}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ba6624c9689698f9ae50339bf4fa41ca188edb609ca4047fb899ef6657e7265"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/stmt.rs: FileTooLong \u2014 1402 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 91% of them inside a single declaration: BindingsBuilder (184-2170). The bar is 500 significant lines; this is 902 over it, 2.80\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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"763061055ed90f7a98dc60b990d151e95d0debe1f661a7252f50096e7a3af48e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/types.rs: FileTooLong \u2014 1397 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 62% of them inside a single declaration: Type (4 blocks, 890-2373). The bar is 500 significant lines; this is 897 over it, 2.79\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":"crates/pyrefly_types/src/types.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9869f0d714e308f5c6d1e11cc7eb48f4f1cf462fa9510e1bf0d47f34af19f716"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TypeDisplayContext: ClassTooLong \u2014 1115 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), 42 methods, 2 blocks, lines 163-1768. The bar is 400 significant lines; this is 715 over it, 2.79\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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3f5f4e429285d157265967be27167d0326b025e8a5cd4808eb9adfea84e469e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Stdlib: TooManyMethods \u2014 83 methods. The bar is 30 methods; this is 53 over it, 2.77\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":"crates/pyrefly_types/src/stdlib.rs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"a23b3997d42af36cd7ec92313fc4f254435ba4895c9483f639d802f8b239b164"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/object_model.rs: FileTooLong \u2014 1373 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 873 over it, 2.75\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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"09bccf1758cd21d2eb002b7f30e52cede35a558dbab642674994b0b626016ebe"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.lookup_attr_static1: MethodTooLong \u2014 lookup_attr_static1 runs 273 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 173 over it, 2.73\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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":1737}}}],"partialFingerprints":{"codehealthFindingId/v1":"d584697ff32752a6cd0928ecad3d111cc5af09b5f9c886e2d9b0097a20ea6716"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BindingsBuilder: ClassTooLong \u2014 1089 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), 210 methods, 5 blocks, lines 286-2925. The bar is 400 significant lines; this is 689 over it, 2.72\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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"00fa095fa92b23fc8f6281277d9ac02f08e701e7f69780159fea53c70e043f7b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Binding.fmt: MethodTooLong \u2014 fmt runs 271 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 171 over it, 2.71\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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":2699}}}],"partialFingerprints":{"codehealthFindingId/v1":"395452a32ecf90beaa18c27db4f58a5ac258508ad5cfe6d3cea3257905d5f822"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AnswersSolver: ClassTooLong \u2014 1066 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), 1175 methods, 2 blocks, lines 2070-4034. The bar is 400 significant lines; this is 666 over it, 2.67\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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":2070}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d13f2e7968bd2191c6ca87cdc72deecd7f2f37d54a646cf47048a867aa297e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.call_infer_with_callee_range: MethodTooLong \u2014 call_infer_with_callee_range runs 266 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 166 over it, 2.66\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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":1759}}}],"partialFingerprints":{"codehealthFindingId/v1":"d82a782f05e36f4ac3f7b7c5d6bfd7c92d4d35e05ce99ef534e0dac2a7137ad1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Subset.is_subset_param_list_impl: MethodTooLong \u2014 is_subset_param_list_impl runs 258 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 158 over it, 2.58\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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"7da73c3e2d591f88ee9a85941b5422c2f0ae0159c08121a02094565a4c4c4204"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/display.rs: FileTooLong \u2014 1275 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 87% of them inside a single declaration: TypeDisplayContext (2 blocks, 163-1768). The bar is 500 significant lines; this is 775 over it, 2.55\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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb703ce042f1f255859eb5c66dbc773144ab59d125d445ee0975c0b22a874d40"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/config.rs: FileTooLong \u2014 1270 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 69% of them inside a single declaration: ConfigFile (5 blocks, 579-2184). The bar is 500 significant lines; this is 770 over it, 2.54\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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ea3ec59990f62672cf4f6abd52348ac89aa8d6cce2f69da44298729d0245b39"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Solver: TooManyMethods \u2014 76 methods. The bar is 30 methods; this is 46 over it, 2.53\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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6a7daf340f26f5d6c304dad55e2224df304e10eeaadb8dd648a597f339a4f08"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.call_functools_partial: MethodTooLong \u2014 call_functools_partial runs 253 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 153 over it, 2.53\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":"pyrefly/lib/alt/functools.rs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"7059517322c4c52c8ac93dca6f52b43af144c4c237d6e227f8e07342590b7ed1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DslValidator.validate_return: MethodTooLong \u2014 validate_return runs 250 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 150 over it, 2.50\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":4946}}}],"partialFingerprints":{"codehealthFindingId/v1":"2efae1bce31b939f37226569821c4baae926470c11489067a2f2dfdd4b443d55"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.solve_expectation: MethodTooLong \u2014 solve_expectation runs 250 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 150 over it, 2.50\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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":2579}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca888c720f4a1ea92914245c4847905656b43915c1edde85acbc5b743398bcb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.class_def_inner: MethodTooLong \u2014 class_def_inner runs 248 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 148 over it, 2.48\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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e3f5fcf4c519a01e97a46880a2378797dfbabbc1fabcf2a18287cb0a6f5a158"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lib/query.rs: FileTooLong \u2014 1235 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 735 over it, 2.47\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":"pyrefly/lib/query.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ec192594bed00d0042082095dbf86d92b99649c333e0d282b08efa847e68efc"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Transaction.completion_sorted_opt_with_incomplete: MethodTooLong \u2014 completion_sorted_opt_with_incomplete runs 247 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 147 over it, 2.47\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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":1068}}}],"partialFingerprints":{"codehealthFindingId/v1":"e049d33ad07bc8b83d1a8681ba95b854db14f1e1d1d92270e518ff4f8f71f8f2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.binding_to_type: MethodTooLong \u2014 binding_to_type runs 242 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 142 over it, 2.42\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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6303}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2ddc3a976e68ef9e3e351a54a19cda6407208020cbdfd4bca85f6e0fd107717"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: NarrowOps.from_expr_helper: MethodTooLong \u2014 from_expr_helper runs 237 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 137 over it, 2.37\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":"pyrefly/lib/binding/narrow.rs"},"region":{"startLine":889}}}],"partialFingerprints":{"codehealthFindingId/v1":"81bb381fc54e37eb3e9e6e0ec3358c34522c7062411c8635295ed61dc85333e6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.apply_special_form: MethodTooLong \u2014 apply_special_form runs 229 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 129 over it, 2.29\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":"pyrefly/lib/alt/specials.rs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2cb17a1380f8425b669c57e7cf077e52f9b0eaa04a22527a5bda121fe496e62"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.callable_infer_inner: MethodTooLong \u2014 callable_infer_inner runs 227 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 127 over it, 2.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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":2207}}}],"partialFingerprints":{"codehealthFindingId/v1":"61dddec4d8643e8599362aa26037a38c8b488b89cba454592d6cbfdd9895af91"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/class.rs: FileTooLong \u2014 1124 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 91% of them inside a single declaration: BindingsBuilder (117-1574). The bar is 500 significant lines; this is 624 over it, 2.25\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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bf047544be5020eb1e36ab5df78fe9849210d51eeeb7c800c841033587b52fe"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.ensure_type_impl: MethodTooLong \u2014 ensure_type_impl runs 223 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 123 over it, 2.23\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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":1282}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a616ccbb595e3cfd084d8a4e709eabe0cca41ebbaadf01eaf4d4033ca64f3c6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: Stdlib: TooManyFields \u2014 66 stored fields beside 83 methods. The bar is 30 stored fields; this is 36 over it, 2.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":"crates/pyrefly_types/src/stdlib.rs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"67b34b08afb57e3fb5f68dcb6b317eb74da7e40dc8159391f25d9772b05b4148"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TypeHeap: TooManyMethods \u2014 66 methods. The bar is 30 methods; this is 36 over it, 2.20\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":"crates/pyrefly_types/src/heap.rs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ac64f1b7c35d6d5728b24424fba07262bfc1c1547aed4a207ffaff290c5e405"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ConfigFile: ClassTooLong \u2014 876 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), 53 methods, 5 blocks, lines 579-2184. The bar is 400 significant lines; this is 476 over it, 2.19\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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":579}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc4572b272333e810350cc903425466b29407b903a92de6febcc556041bd992d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/expr.rs: FileTooLong \u2014 1088 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 83% of them inside a single declaration: BindingsBuilder (285-1656). The bar is 500 significant lines; this is 588 over it, 2.18\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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ff039add95ab7cb05c1882289acb2e3b94035d3ae8aee0f3a233bf8ea203350"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.expr_call_infer: MethodTooLong \u2014 expr_call_infer runs 217 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 117 over it, 2.17\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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":2543}}}],"partialFingerprints":{"codehealthFindingId/v1":"d66d58d343851888fcecb00564a59eb3c9197867747b325071e0007dfaf7fb0b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Type: ClassTooLong \u2014 860 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), 112 methods, 4 blocks, lines 890-2373. The bar is 400 significant lines; this is 460 over it, 2.15\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":"crates/pyrefly_types/src/types.rs"},"region":{"startLine":890}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd2da053468eae1252b5501df4f091a78414f3d38c8fa5bf264f5d5b1380914"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/answers.rs: FileTooLong \u2014 1074 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 574 over it, 2.15\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":"pyrefly/lib/alt/answers.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ce6c9454210226ac2772727d7f7eefa4fa8638104aae1a3a78e6c60df7e7f67"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: class/dataclass.rs: FileTooLong \u2014 1066 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 94% of them inside a single declaration: AnswersSolver (81-1537). The bar is 500 significant lines; this is 566 over it, 2.13\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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"539f1064d0e4f122296d22b7f7b6ae09387bfc771e918bcf296be59810619295"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.construct_class_inner: MethodTooLong \u2014 construct_class_inner runs 212 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 112 over it, 2.12\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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":1230}}}],"partialFingerprints":{"codehealthFindingId/v1":"efaaab87c65a01a8471caf3168561d3ae9d1e88b18304994adb7e16088ea8fb4"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Subset: TooManyMethods \u2014 63 methods, declared across 2 files: solver/subset.rs (46), solver/solver.rs (17). The bar is 30 methods; this is 33 over it, 2.10\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. 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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3282}}}],"partialFingerprints":{"codehealthFindingId/v1":"1246de86477a3598149c016bf78ac99ac67e17452e481ec620189ee934a1adc2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::report::cinderx::convert::type_to_structured: FunctionTooLong \u2014 pyrefly::lib::report::cinderx::convert::type_to_structured runs 210 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 110 over it, 2.10\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":"pyrefly/lib/report/cinderx/convert.rs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d63db26034e02d5d4033b2592b59c6d75a56154178bbc119659bbf868559e9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Server.code_action: MethodTooLong \u2014 code_action 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4964}}}],"partialFingerprints":{"codehealthFindingId/v1":"550691f78f1f2647a1b1ca017a6188bacb01aa683e00ef89c30613293d886cc6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly_types::meta_shape_dsl::eval_dsl_expr: FunctionTooLong \u2014 pyrefly_types::meta_shape_dsl::eval_dsl_expr runs 208 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 108 over it, 2.08\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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2373}}}],"partialFingerprints":{"codehealthFindingId/v1":"91a5f448737c96a5ddb9b2896f2c20687dfbd6f4052f30db623e75ead371ccb0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.get_params_and_paramspec: MethodTooLong \u2014 get_params_and_paramspec runs 208 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 108 over it, 2.08\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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":1316}}}],"partialFingerprints":{"codehealthFindingId/v1":"96c6e28f30bb57f6247665be7e920072dfbf2311c0e1bb8d0d21b2fc4f02363a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TestClient: TooManyMethods \u2014 62 methods. The bar is 30 methods; this is 32 over it, 2.07\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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed34fa4a87e1195e950cc9fe8c8672d48fb5ddd4768497592811a8be9ae80ad2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/type_level_dsl.rs: FileTooLong \u2014 1033 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 86% of them inside a single declaration: AnswersSolver (175-1337). The bar is 500 significant lines; this is 533 over it, 2.07\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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0060f6e055201cf7f70593e7655f2fb1a6011af25c27d268aad81e4de61dffd"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.undecorated_function: MethodTooLong \u2014 undecorated_function runs 200 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 100 over it, 2.00\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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2e93dcc89c83f3f177e28f2d9d723659b20393153945e4b5ee86e917e13a6b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/narrow.rs: FileTooLong \u2014 998 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 498 over it, 2.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":"pyrefly/lib/binding/narrow.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"954e2b425762fc38cd5ca2c231f81a3e431f4ca85c173643292ea7f6cb5eb27d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.call_overloads: MethodTooLong \u2014 call_overloads runs 198 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 98 over it, 1.98\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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe822403c860b4b475d49c8c60c321c45a18641dfbcef1e2e4e19c4089dc4194"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: RuleOverrides: TooManyFields \u2014 59 stored fields beside 1 method. The bar is 30 stored fields; this is 29 over it, 1.97\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":"crates/pyrefly_config/src/migration/pyright.rs"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f8c6f07d5ab39a36e3dceb033e4fabbe6efd3fcad608489efd6569df24528e6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::report::pysa::ast_visitor::visit_statement: FunctionTooLong \u2014 pyrefly::lib::report::pysa::ast_visitor::visit_statement runs 195 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 95 over it, 1.95\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":"pyrefly/lib/report/pysa/ast_visitor.rs"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbfd7ed7abb0fcdd44ba8fc4ab1ee59ce2ff790b0579f0bf08094a180acaa503"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: wasm/completion.rs: FileTooLong \u2014 963 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 86% of them inside a single declaration: Transaction (205-1412). The bar is 500 significant lines; this is 463 over it, 1.93\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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8fb1a747fb38206d5ecada93bf5d5f9639fe304cae9e33303d562cfa7cb2c6a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.as_attribute_base1: MethodTooLong \u2014 as_attribute_base1 runs 192 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 92 over it, 1.92\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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2530}}}],"partialFingerprints":{"codehealthFindingId/v1":"38d4d586b6e6b9f845903eeb234896575f2da74eeab9ff11de0726e7a79fa9da"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::query::type_table::type_to_indexed_shape: FunctionTooLong \u2014 pyrefly::lib::query::type_table::type_to_indexed_shape runs 191 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 91 over it, 1.91\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":"pyrefly/lib/query/type_table.rs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad8680f76adf44a3a2a9c6eec64a44825a2fe924b4f8a8a9a8426e818b42df31"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.narrow: MethodTooLong \u2014 narrow runs 182 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 82 over it, 1.82\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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":2031}}}],"partialFingerprints":{"codehealthFindingId/v1":"341b9598e4b62f5dfc14a9e0f1ab2844a36178ec4621b94fcee3a0c1548b6ba1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TypeCheckKind.format_error: MethodTooLong \u2014 format_error runs 178 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 78 over it, 1.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":"pyrefly/lib/error/display.rs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f0e87ee71a279d946a2353a0e969266dadcd8c3d3e5126ce6ff8e4e6f1cf669"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TestClient: ClassTooLong \u2014 708 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), 62 methods, 2 blocks, lines 258-1294. The bar is 400 significant lines; this is 308 over it, 1.77\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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff09e5271ac41c3d65fcf4ea06c27ef86141d5ab4b910d702a2a4eaaf321ef5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ConfigFile: TooManyMethods \u2014 53 methods. The bar is 30 methods; this is 23 over it, 1.77\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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":579}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff73135a6069af63ed4c87dd78fa88557b6ded5290f2e920395f75f622aa4f1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: extension.activate: FunctionTooLong \u2014 activate runs 176 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 76 over it, 1.76\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":"lsp/src/extension.ts"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d428d1279bbcf34447a1a6bfed1d9b6e4ee01530def8186cf95a339625b13e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/operators.rs: FileTooLong \u2014 872 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 95% of them inside a single declaration: AnswersSolver (59-1243). The bar is 500 significant lines; this is 372 over it, 1.74\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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"813b3b266be8ddd815e6e3fe759f651ab08c73e4dd7fa3e1b6bdbf422ab8d2e4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly_types::meta_shape_dsl::convert_expr: FunctionTooLong \u2014 pyrefly_types::meta_shape_dsl::convert_expr runs 174 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 74 over it, 1.74\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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1030}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b51e386a061851b47fdebcabd2ad732b55788980357ab288257935cd63951e7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ModuleName: TooManyMethods \u2014 52 methods. The bar is 30 methods; this is 22 over it, 1.73\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":"crates/pyrefly_python/src/module_name.rs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"f00f458a66d2d31fff6d0a25ca77703c22ffaf6d5f9e0f68aba164911997ca6b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/shaped_array.rs: FileTooLong \u2014 866 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 33 free functions. The bar is 500 significant lines; this is 366 over it, 1.73\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":"crates/pyrefly_types/src/shaped_array.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2911bd3416c7658516e32f4effa842af554f4695491f698d840506df4086ae4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/dimension.rs: FileTooLong \u2014 863 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 53 free functions. The bar is 500 significant lines; this is 363 over it, 1.73\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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4336fe7f8489392ab60ef9d7aa3def36ac7d1454c8dc2789f27f20392c72c042"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.is_class_attribute_subset: MethodTooLong \u2014 is_class_attribute_subset runs 172 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 72 over it, 1.72\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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5608}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ca680388c0c06c661c7a1fdea2a136ed3363388a9f5faec56d820b1b735feab"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.decorated_function_type: MethodTooLong \u2014 decorated_function_type runs 171 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 71 over it, 1.71\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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"c28819418f47020f3efa65b37f0dd56356b5b35b3b591acb602dd7e7f4bf7095"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/overload.rs: FileTooLong \u2014 830 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 78% of them inside a single declaration: AnswersSolver (260-1180). The bar is 500 significant lines; this is 330 over it, 1.66\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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d35653b898d99f3b096aa6b36ed3a2b76db8f4a2e24d9bc9749b95e0483d4f8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Transaction.inlay_hints: MethodTooLong \u2014 inlay_hints runs 166 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 66 over it, 1.66\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":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ae3b4e8b600912b9a162ba22a09eac3e35d6154bfd60302cba0738fb91dcbf3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Errors.collect_unused_ignore_errors: MethodTooLong \u2014 collect_unused_ignore_errors runs 166 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 66 over it, 1.66\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":"pyrefly/lib/state/errors.rs"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"49b8d154e58bf7e33171e7a05f6acd3f4f590e111e9473ae491ccfb253b18908"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.parse_dimension_expr_with_context: MethodTooLong \u2014 parse_dimension_expr_with_context runs 164 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 64 over it, 1.64\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":4342}}}],"partialFingerprints":{"codehealthFindingId/v1":"319d0dfef49b1bb8aa0e628fa0e0f84f53ab757f6e579716de9e83bc15c0164f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.invert_map_int_tuples_parameter_pattern: MethodTooLong \u2014 invert_map_int_tuples_parameter_pattern runs 164 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 64 over it, 1.64\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":"pyrefly/lib/alt/map_int_tuples.rs"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf165e0d3050be7b2260097e2591193d253edccfc41709c86a7edd3684c472aa"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: Server: TooManyFields \u2014 49 stored fields beside 111 methods. 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1112}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d5d3249dd7d6181091d61ac2bee5e69e6e1c3c343d88905b2d5ce9c58d6b636"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DslValidator: TooManyMethods \u2014 49 methods. The bar is 30 methods; this is 19 over it, 1.63\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":1937}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e2d299d5f79eb309ee166e3ff537be6c4ecb36692bc5f191650d4fbbc792ec8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: class/typed_dict.rs: FileTooLong \u2014 812 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 91% of them inside a single declaration: AnswersSolver (78-1140). The bar is 500 significant lines; this is 312 over it, 1.62\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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"550438ed368efda5a6aa9e900ec2fc77335e444d53afb61f5c5c28cc16456e2e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ConfigFile.configure_at: MethodTooLong \u2014 configure_at runs 162 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 62 over it, 1.62\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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1578}}}],"partialFingerprints":{"codehealthFindingId/v1":"efced29763ebc3ef9752a7d0395c42cdf893971504f1a6e15206d118aafc74da"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CallGraphVisitor.resolve_attribute_access: MethodTooLong \u2014 resolve_attribute_access runs 162 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 62 over it, 1.62\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2639}}}],"partialFingerprints":{"codehealthFindingId/v1":"60692136673f42d1bc880095b9ccc7da77556383ecf9e9a887fbf46ed3212583"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: RuleOverrides.to_config: MethodTooLong \u2014 to_config runs 161 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 61 over it, 1.61\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":"crates/pyrefly_config/src/migration/pyright.rs"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"537f67db58f9c830a892130cd8127b5a20856ab6452260007f0a76bbaaf5168b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CallGraphVisitor.resolve_pyrefly_target: MethodTooLong \u2014 resolve_pyrefly_target runs 161 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 61 over it, 1.61\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2166}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fe1549e1cee8e83af0d21501d8716dee0b4bb33a23c6ffd4e306960a8bc0df3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Transaction.local_quickfix_code_actions_sorted: MethodTooLong \u2014 local_quickfix_code_actions_sorted runs 161 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 61 over it, 1.61\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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":3328}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8b6a77e5f92d7822082220e5fcc33169176001968876eefe7652448c45a0314"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CallGraphVisitor: TooManyMethods \u2014 48 methods. The bar is 30 methods; this is 18 over it, 1.60\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":1497}}}],"partialFingerprints":{"codehealthFindingId/v1":"2467b0fae1454de1375bfda8e17c7d587f1f29b0199195b7d993d912ff5a4545"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.stmt_match: MethodTooLong \u2014 stmt_match runs 160 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 60 over it, 1.60\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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":871}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc6c87abfffe681f98ca392ecd551eaf0c555766704fce500c75b36b714414d0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Transaction.demand: MethodTooLong \u2014 demand runs 160 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 60 over it, 1.60\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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1457}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6ed0eddbd7362d5f82fe188e8458d19e599b026ee1d378cca6d92d017a40793"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly_types::meta_shape_dsl::eval_call: FunctionTooLong \u2014 pyrefly_types::meta_shape_dsl::eval_call runs 158 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 58 over it, 1.58\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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2946}}}],"partialFingerprints":{"codehealthFindingId/v1":"989aed4781e3e33613289028fcc32af517674f1d01e7606e554d1e23393eff51"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: wasm/hover.rs: FileTooLong \u2014 787 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 287 over it, 1.57\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":"pyrefly/lib/lsp/wasm/hover.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8ed717bcc1884fd3554cca84a8a31f7a3eab370e5bd1091e1a5eea50aeb3c0b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/function.rs: FileTooLong \u2014 771 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: BindingsBuilder (283-968). The bar is 500 significant lines; this is 271 over it, 1.54\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":"pyrefly/lib/binding/function.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ed19d1ee4a1314f415e428988d64f24343c2a1cde40381ad13cbcf7beb16f7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DslValidator.validate_assignment_value: MethodTooLong \u2014 validate_assignment_value runs 154 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 54 over it, 1.54\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3953}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8104fd1f06dd1817dd6e447d29ee9b6f08806f493c2e7a114b27815dec89792"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: StructurallyValidatedTypeShapeDslFunction.evaluate_generator: MethodTooLong \u2014 evaluate_generator runs 153 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 53 over it, 1.53\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6510}}}],"partialFingerprints":{"codehealthFindingId/v1":"836be207698e80c8f7606a0a945d4ff61f03b7b876708f8b292c51bd0a47cb2e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: stubgen/extract.rs: FileTooLong \u2014 751 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 35 free functions. The bar is 500 significant lines; this is 251 over it, 1.50\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":"pyrefly/lib/stubgen/extract.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a5a103649edb787bf5a059ffcffe70396b9456536505c6bb8c335279cb55d9f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.find_closest_overload: MethodTooLong \u2014 find_closest_overload runs 150 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 50 over it, 1.50\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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"981dd3b2c27a45a20588fecc4cdac744a50650126ecf8b045e921b370ee81fbb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/pattern.rs: FileTooLong \u2014 742 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 83% of them inside a single declaration: BindingsBuilder (200-1103). The bar is 500 significant lines; this is 242 over it, 1.48\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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e24e883c1bdea287fea19e8e276f7eb904c5dfd8f2fa9c19de2425475d71d2bb"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Subset: ClassTooLong \u2014 593 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), 63 methods, 2 blocks, lines 3282-4197. The bar is 400 significant lines; this is 193 over it, 1.48\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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3282}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b2f1356294cf1a761a573d37f20bdd8b5cab5e52c3345a0b45e6f93fabcd16"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ClassField: ClassTooLong \u2014 593 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), 43 methods, 2 blocks, lines 421-1239. The bar is 400 significant lines; this is 193 over it, 1.48\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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"4353a2b6a9279feed2f14c99f9c87fbc2c7d4e1866bfa9736648e380eef4a7bc"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: TelemetryTransactionStats: TooManyFields \u2014 44 stored fields. The bar is 30 stored fields; this is 14 over it, 1.47\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":"crates/pyrefly_util/src/telemetry.rs"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"9de72a05c8f6a4be314c20b7cb1389afa0b1054c7693f71bc9086ef526287155"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ClassField: TooManyMethods \u2014 43 methods. The bar is 30 methods; this is 13 over it, 1.43\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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d4054d031cf3812692f0f6cb9c46075b5348aa84253e888acd561e29617f53"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/sys_info.rs: FileTooLong \u2014 716 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 216 over it, 1.43\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":"crates/pyrefly_python/src/sys_info.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ab8f3cf922b5509b5445a37b0cd6e77d1781237e851dc9415387ec8fac98f8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.solve_function_binding: MethodTooLong \u2014 solve_function_binding runs 143 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 43 over it, 1.43\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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"66b31711d4741c5ef4f448de687572618ecb0a03d57ad5c035bf2a8d8d1d3e7e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: aiLandingPageHeader.AiLandingPageHeader: FunctionTooLong \u2014 AiLandingPageHeader runs 143 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 43 over it, 1.43\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":"website/src/components/landing-page/aiLandingPageHeader.tsx"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"765b7bafb789fb080e4f1d8d9a9d964ce3ccfe2f3b6e08796169292005e9bea5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lsp/dict_completions.rs: FileTooLong \u2014 713 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 92% of them inside a single declaration: Transaction (91-1027). The bar is 500 significant lines; this is 213 over it, 1.43\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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ef2b08ad29040201a4da243ab85501677214ed22fb51e9c9289a6b5a5645b13"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.get_dataclass_synthesized_fields: MethodTooLong \u2014 get_dataclass_synthesized_fields runs 142 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 42 over it, 1.42\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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"196e914a8e685e862225de846c671c921d9754f351bdf830f4d1f4e8898513b4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.check_shape_flag_constructor_sources: MethodTooLong \u2014 check_shape_flag_constructor_sources runs 142 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 42 over it, 1.42\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":"pyrefly/lib/alt/shape_flag.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d689b32f24abeca860eac9896f2ae573cf4ef9e612a7b0f55136cb3d0b2292"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/shape_index.rs: FileTooLong \u2014 704 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 204 over it, 1.41\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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21cc91241a25ea083e356be8bdc31e8ddb05a85077a19f1fd1f2faa2109e8bf7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TypeDisplayContext: TooManyMethods \u2014 42 methods. The bar is 30 methods; this is 12 over it, 1.40\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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d9f423aaf4d7fd3aeadcf97d991927edc241715e8b0ff21c64f6c6bd7129416"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.pydantic_config: MethodTooLong \u2014 pydantic_config runs 140 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 40 over it, 1.40\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":"pyrefly/lib/alt/class/pydantic.rs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"da5648ec485f90549f9442b0a8cce8580c0694c0b4927f8680204de37b88c31c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Solver.finish_quantified_with_captures: MethodTooLong \u2014 finish_quantified_with_captures runs 140 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 40 over it, 1.40\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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":2103}}}],"partialFingerprints":{"codehealthFindingId/v1":"31bbb081546418f517b9d7d30e53ccb8b00fd59fab72a5a112993dea58110d6c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: types/class_metadata.rs: FileTooLong \u2014 695 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 195 over it, 1.39\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":"pyrefly/lib/alt/types/class_metadata.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"297e5f30936a7a2838462ff11ff169f48f9149fef99f3d56f4311682bab94a96"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.overload_error: MethodTooLong \u2014 overload_error runs 139 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 39 over it, 1.39\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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1949109cdbe88a01f1183af0a8a1eacfed5b370a3a154effc62ca2fb64ae8a1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.typevar_from_call: MethodTooLong \u2014 typevar_from_call runs 138 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 38 over it, 1.38\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":2772}}}],"partialFingerprints":{"codehealthFindingId/v1":"14dbdbcbdc323b14034c818f9b49b8719c23494dbf8b497f0c4a2169fd76dc87"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DslValidator.validate_generator_source: MethodTooLong \u2014 validate_generator_source runs 137 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 37 over it, 1.37\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3086}}}],"partialFingerprints":{"codehealthFindingId/v1":"69fcc2d99c8bb212af2e3917e1b05f1fbd164a66c992520a8e3668557cfcc5da"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: commands/bazel_check.rs: FileTooLong \u2014 679 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 179 over it, 1.36\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":"pyrefly/lib/commands/bazel_check.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d6be3d4e5e744a2dc4a2aab95e1eadbb852d32ab88fdafcad0b26bd66b8467"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.as_attribute_base1_of_type: MethodTooLong \u2014 as_attribute_base1_of_type runs 135 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 35 over it, 1.35\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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2814}}}],"partialFingerprints":{"codehealthFindingId/v1":"878f8748989cdef9ab6837e6e7376ae129b959d60e16ff1ac8c01ccc0f8fd518"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Subset.bind_tensor_dimensions: MethodTooLong \u2014 bind_tensor_dimensions runs 135 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 35 over it, 1.35\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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":3227}}}],"partialFingerprints":{"codehealthFindingId/v1":"01cf11c7919c972a69903be6287e394bff940e1a361693979c092e843e4d7199"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pysa/capnp_writer.rs: FileTooLong \u2014 670 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 40 free functions. The bar is 500 significant lines; this is 170 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":"pyrefly/lib/report/pysa/capnp_writer.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"69e5231f11fb09dd83dff8b840b934b10ab123e8869bc5d114d2a85d8037eeb3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TypeShapeDslHelperCall.argument_domains: MethodTooLong \u2014 argument_domains runs 134 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 34 over it, 1.34\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"23b7f740f6801a5f83e90859e1179ab6d24c1770f19f275b564fbb1cce58a214"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingExpect.fmt: MethodTooLong \u2014 fmt runs 134 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 34 over it, 1.34\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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":1343}}}],"partialFingerprints":{"codehealthFindingId/v1":"a124785f7096ea0040e40361304988ae30e2df8c7c6455ba2b191407d785b562"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Bindings.new: MethodTooLong \u2014 new runs 134 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 34 over it, 1.34\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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b7c5d543efcd9c3d19585a79379460470b604a890d98d9e2bf7306be6a3c95b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.tvars_to_tparams_for_type_alias: MethodTooLong \u2014 tvars_to_tparams_for_type_alias runs 133 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 33 over it, 1.33\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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1313}}}],"partialFingerprints":{"codehealthFindingId/v1":"cab08e8f95d9bde78e8f9f8ae7264e5f113f9b77a3c83ef42447b54b7eb9e226"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CallGraphVisitor.resolve_and_register_expression: MethodTooLong \u2014 resolve_and_register_expression runs 131 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 31 over it, 1.31\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":3886}}}],"partialFingerprints":{"codehealthFindingId/v1":"67a6b417c8a0a03181d0a400653eeb4e8d6063eb5c13edfe78256c2554eb7816"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::lsp::wasm::hover::get_hover_with_verbosity: FunctionTooLong \u2014 pyrefly::lib::lsp::wasm::hover::get_hover_with_verbosity runs 130 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 30 over it, 1.30\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":"pyrefly/lib/lsp/wasm/hover.rs"},"region":{"startLine":930}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4973a38f2e5b652cc28ce38874e11439e02acf838cb61743b32ecde03551285"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TypeConverter.convert: MethodTooLong \u2014 convert runs 130 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 30 over it, 1.30\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":"pyrefly/lib/tsp/type_conversion.rs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5364fb040e0f480df2af697f838bc3751c8c8fc1fd7eb4299b127ede0d5779a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.infer_shaped_array_index: MethodTooLong \u2014 infer_shaped_array_index runs 129 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 29 over it, 1.29\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3976}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8079a4e5f6e0c51d829eaaf301fff9641af9a3aae9f0cf246ccbe48684a94e0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/special_calls.rs: FileTooLong \u2014 638 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 91% of them inside a single declaration: AnswersSolver (48-873). The bar is 500 significant lines; this is 138 over it, 1.28\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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a11cc265c2e7baf715f7b1be1952164d1ef905bedcb8f7a29cc554cd4709bd3"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DslValidator.validate_dimension: MethodTooLong \u2014 validate_dimension 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2492}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d4c460bc5ff669ab37bd1deb6fb89c879f89d5ff341f4f2ddd3d4cb727edd90"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.dataclass_metadata: MethodTooLong \u2014 dataclass_metadata 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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1419}}}],"partialFingerprints":{"codehealthFindingId/v1":"80c60db545c00fd1e20961e74f6800963a73e72c6652adca1d0c83ab75f43697"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.subscript_str_literal: MethodTooLong \u2014 subscript_str_literal 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":"pyrefly/lib/alt/subscript.rs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"f02a72ebfd4e6db936f6603c6f34a3157547433d864de49812a4753d93bd7cfa"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.function_body: MethodTooLong \u2014 function_body 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":"pyrefly/lib/binding/function.rs"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"34caa9b4da9491d3ba41c41b5287587edb86c9eb6a2a08d387b33f36805fb191"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: protocol_generator/generate_protocol.py: FileTooLong \u2014 633 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 133 over it, 1.27\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":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e55a9101b4477d71b37a2a7b437181b127891592ec3c195f3a771ec2ecc5327"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Stdlib.new_with_bootstrapping: MethodTooLong \u2014 new_with_bootstrapping runs 126 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 26 over it, 1.26\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":"crates/pyrefly_types/src/stdlib.rs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"e60ef0fb68140e9dd9abae952cca2f60c4dd1f6edbd72473b64510a29ae07e7e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: quick_fixes/move_module.rs: FileTooLong \u2014 627 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 127 over it, 1.25\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":"pyrefly/lib/state/lsp/quick_fixes/move_module.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33acc3e27ec8ad7edbee690acc08499404de0b8bdd4eb5a8eb285558edad91b5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Query: ClassTooLong \u2014 501 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), 17 methods, 2 blocks, lines 151-1751. The bar is 400 significant lines; this is 101 over it, 1.25\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":"pyrefly/lib/query.rs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6cd10aa570502cf824ff1f5048506ff905c361bd7ba9c455e4465a3cc24da29"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CalleesWithLocation: ClassTooLong \u2014 500 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), 25 methods, 2 blocks, lines 365-1056. The bar is 400 significant lines; this is 100 over it, 1.25\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":"pyrefly/lib/query.rs"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ecd0c2bb986d001884020e02189e588d8a90ca4a4745b6ceadd1b1c8c7e1b4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.validate_type_form: MethodTooLong \u2014 validate_type_form runs 125 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 25 over it, 1.25\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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":7196}}}],"partialFingerprints":{"codehealthFindingId/v1":"f54124b04b16ce6610483fb49cb7fd2b9f69d6cac22e4eb108c213bb857b1b62"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CheckArgs: ClassTooLong \u2014 496 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), 9 methods, 2 blocks, lines 224-2303. The bar is 400 significant lines; this is 96 over it, 1.24\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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"a42a4b0c795928411a43248cf30a6ddc4ad535acbd9e07c0d341a2d757391aad"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: export/definitions.rs: FileTooLong \u2014 620 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 61% of them inside a single declaration: DefinitionsBuilder (2 blocks, 299-1017). The bar is 500 significant lines; this is 120 over it, 1.24\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":"pyrefly/lib/export/definitions.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d84a4864a51e8a32e0ce172750300055917cb820f76bec130c19d6b1aa76d7df"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.dict_items_infer_inner: MethodTooLong \u2014 dict_items_infer_inner runs 124 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 24 over it, 1.24\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1885}}}],"partialFingerprints":{"codehealthFindingId/v1":"49667489515306d8e9232af383639fcb09d43e6d4e3496c071e07e39780a33cb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: wasm/inlay_hints.rs: FileTooLong \u2014 619 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 75% of them inside a single declaration: Transaction (211-900). The bar is 500 significant lines; this is 119 over it, 1.24\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":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc876a45aa96ecce84a0f67852dff0f302b6d3b75259ed6931bb42404e13f180"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.parse_registered_shaped_array_type: MethodTooLong \u2014 parse_registered_shaped_array_type runs 123 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 23 over it, 1.23\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":5146}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e1e073dc9f0c05ab876bfe589aa8de140d30fb296006df2612779833552b26"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/globs.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":"crates/pyrefly_util/src/globs.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f66d4c359dbc655b524c9598c2e2bb31907aba6ab5c68146a60d68a06272c2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.check_type_is_class_object: MethodTooLong \u2014 check_type_is_class_object runs 122 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 22 over it, 1.22\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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"e889e76bea9a406183cc427a88a0b0fd598b93f199b261efbeaced0bff064324"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SemanticTokenBuilder.process_stmt: MethodTooLong \u2014 process_stmt runs 122 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 22 over it, 1.22\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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"332fc38440fef365a434c11a46e18973720e4b8ee06dcd0af3e14944d48db782"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly_python::folding::folding_ranges: FunctionTooLong \u2014 pyrefly_python::folding::folding_ranges runs 121 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 21 over it, 1.21\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":"crates/pyrefly_python/src/folding.rs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ef430f19868e932a7173b14635dcab52943c6fd78d36f0c880ce95d9beee71e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.merged_flow_info: MethodTooLong \u2014 merged_flow_info runs 121 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 21 over it, 1.21\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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":3903}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf60e5b698ec2f95dbadada71f382e2f8c236d00b52f4484cb45897f40424f02"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::error::suppress::add_suppressions: FunctionTooLong \u2014 pyrefly::lib::error::suppress::add_suppressions runs 121 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 21 over it, 1.21\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":"pyrefly/lib/error/suppress.rs"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc8ab75cb6cd4ee7826c4b6657165a21d3272be899b16da65577d7ca49632a2e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Server.new: MethodTooLong \u2014 new runs 121 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 21 over it, 1.21\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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":2917}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbec8a3c2a37ac1bbb9326cebcf1e2c1d980e445adca8bbda5602d060218fc27"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: class/pydantic.rs: FileTooLong \u2014 604 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 86% of them inside a single declaration: AnswersSolver (110-875). The bar is 500 significant lines; this is 104 over it, 1.21\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":"pyrefly/lib/alt/class/pydantic.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e4e79ac1c8f49172075e082a7e22896f56bcb294a61f061df2b55009c9b63f8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: class/django.rs: FileTooLong \u2014 603 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 86% of them inside a single declaration: AnswersSolver (119-922). The bar is 500 significant lines; this is 103 over it, 1.21\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":"pyrefly/lib/alt/class/django.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5749382f9849a48be2b10c9f8fb44b94f683cba479278da14f136e93b16db15d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/module_resolver.rs: FileTooLong \u2014 600 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 100 over it, 1.20\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":"crates/pyrefly_build/src/module_resolver.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"97e5d0d58d415d96d93de77f7732f6bc27758d9b59abf0f568b5c87e58a1ff37"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: pysa/function.rs: FileTooLong \u2014 600 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 100 over it, 1.20\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":"pyrefly/lib/report/pysa/function.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc8d9aaeee233b87abbd52db6dbd9c10c4ff5376d8dec6be479325542b51e2ef"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Transaction.find_operator_dunder: MethodTooLong \u2014 find_operator_dunder runs 120 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 20 over it, 1.20\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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2244}}}],"partialFingerprints":{"codehealthFindingId/v1":"da277c64dbeb26bd10b9a87418175cda3f184282bdd7b4846613508617b921ad"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/callable.rs: FileTooLong \u2014 598 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 98 over it, 1.20\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":"crates/pyrefly_types/src/callable.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cba50eeddc647a43952c340f1fa7a3ba952f5daa22f731a4f3d2cd072923021c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: query/type_table.rs: FileTooLong \u2014 596 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 96 over it, 1.19\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":"pyrefly/lib/query/type_table.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d42c10bfb7b1bcb7da98a4c7dc9c370ac907712c57e7bd7db3fd6553c6adad69"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Transaction.add_autoimport_completions: MethodTooLong \u2014 add_autoimport_completions runs 119 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 19 over it, 1.19\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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"d632a730599a2e7fc407f285bbc0ba67c1172d1b4e73e1878a55f120aca7e6bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: non_wasm/workspace.rs: FileTooLong \u2014 593 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 93 over it, 1.19\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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c33d75a701e268d40761cf005993c43c1a1398f61654cad839a0ace9e3cffa32"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/type_info.rs: FileTooLong \u2014 592 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 92 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":"crates/pyrefly_types/src/type_info.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfcb5ee52e591be830303a4bd33b896011ff79d3bbbee5b303a50ad5f392c618"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CallArgPreEval.post_check: MethodTooLong \u2014 post_check runs 118 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 18 over it, 1.18\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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2c1c4df7c6950545ab359219d1a0b993e1756e71d00b6a7a7f3838b820c90c4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.class_bases_of: MethodTooLong \u2014 class_bases_of runs 118 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 18 over it, 1.18\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":"pyrefly/lib/alt/types/class_bases.rs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f24b0067e028eb88a76fc75e8ca50f55dd32f8c180db35007bfd3dfd98745ee"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::lsp::non_wasm::will_rename_files::will_rename_files: FunctionTooLong \u2014 pyrefly::lib::lsp::non_wasm::will_rename_files::will_rename_files runs 118 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 18 over it, 1.18\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":"pyrefly/lib/lsp/non_wasm/will_rename_files.rs"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"c502c4561019670e153ea0e1fa1fc8eeae847c1eb85eb919ebc1356730cbf9b8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scripts/compare_typecheckers.py: FileTooLong \u2014 586 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 86 over it, 1.17\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":"scripts/compare_typecheckers.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdcca703c1ecaadb2c8882a6caafbeac07fc9f32aee014fef6b13aacd6be87a5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CalcStack: TooManyMethods \u2014 35 methods. The bar is 30 methods; this is 5 over it, 1.17\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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"f472082479907e40999d7bb5e27a2d2bee090a7cbad8031b6ee3655538f137d6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TypeOrder: TooManyMethods \u2014 35 methods. The bar is 30 methods; this is 5 over it, 1.17\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":"pyrefly/lib/solver/type_order.rs"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"38361c15296a626a268e3ecc10415155f6dbecb1b7c9c5a10ae317a32a0898ac"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Query.get_types_in_file_with_optional_timing: MethodTooLong \u2014 get_types_in_file_with_optional_timing 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":"pyrefly/lib/query.rs"},"region":{"startLine":1352}}}],"partialFingerprints":{"codehealthFindingId/v1":"70193fe04c4ace2486f8b83ef4bcf25287070fdaba7068573df23ef08fcd2427"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tsp/type_conversion.rs: FileTooLong \u2014 579 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 79 over it, 1.16\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":"pyrefly/lib/tsp/type_conversion.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"662e1bcb226dd8c0d08a993a57649725a2246717b2d696ac7eec9948c8513418"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: error/error.rs: FileTooLong \u2014 578 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 78 over it, 1.16\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":"pyrefly/lib/error/error.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"076769c0ca94629a543b3e9ade29f593418368611fc1f883f6900397d4d61389"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: class/variance_inference.rs: FileTooLong \u2014 577 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 77 over it, 1.15\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":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a5031e51b722a0a0b8707e15b5a0c1796f4d7f72f83df1cffd52e8378ae4e8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: class/targs.rs: FileTooLong \u2014 570 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 92% of them inside a single declaration: AnswersSolver (65-849). The bar is 500 significant lines; this is 70 over it, 1.14\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":"pyrefly/lib/alt/class/targs.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"41380d240fa2941484bd96181586278a9d665a7a80074a12c2b30fb6e4b55494"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: BindingsBuilder: TooManyFields \u2014 34 stored fields beside 210 methods. The bar is 30 stored fields; this is 4 over it, 1.13\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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc97d065788aad30a81b6c1374987a530ad127ee142eab5a4116672cb8534ee3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Ast: TooManyMethods \u2014 34 methods. The bar is 30 methods; this is 4 over it, 1.13\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":"crates/pyrefly_python/src/ast.rs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"e27f8a98bc4701c3979ff160b07df90b2153852b8d4338ea7715c7865dc007c9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: quick_fixes/introduce_parameter.rs: FileTooLong \u2014 565 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 65 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":"pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc994b1f8372e71ca7ceb21d5e53b3693111dc91d048a8c1811b307b72312437"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DslValidator.validate_generator: MethodTooLong \u2014 validate_generator runs 113 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 13 over it, 1.13\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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3284}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fb3260299cfbd725b795262e87be0417111b4b7a3198c7f50ac30557b3d720d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.compare_types: MethodTooLong \u2014 compare_types runs 113 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 13 over it, 1.13\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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea69dc5dbd1fae66b08cb154e6244de97961c556476fbfddd996d68f5da083e7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.tvars_to_tparams_for_type_alias_type: MethodTooLong \u2014 tvars_to_tparams_for_type_alias_type runs 113 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 13 over it, 1.13\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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1146}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b266fb1034087aa9ece4a5dca7189081356e118c0dc72ef6435ae75f3e2eca5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: presetLandingPageHeader.PresetLandingPageHeader: FunctionTooLong \u2014 PresetLandingPageHeader runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\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":"website/src/components/landing-page/presetLandingPageHeader.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"376376a920bb30542c8870f3850619c2c34024a8e41f1d50ea382a3d44915d90"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: alt/map_int_tuples.rs: FileTooLong \u2014 563 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 90% of them inside a single declaration: AnswersSolver (104-793). The bar is 500 significant lines; this is 63 over it, 1.13\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":"pyrefly/lib/alt/map_int_tuples.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddc83d8489505cf3abe2d707aab306c739dc37155570b19d89ff78cd4d06fe9b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: state/semantic_tokens.rs: FileTooLong \u2014 556 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 56 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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb85f6951e74f96c747b10f30f116afb4a0b4403a3551b7b0c94616b61565f8f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Bindings: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"90a99c3707479b4d44e6b06c1d0c50a50690dfc067cdc61e4826aa3af7b90416"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly_types::einops::parse_expression: FunctionTooLong \u2014 pyrefly_types::einops::parse_expression runs 110 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 10 over it, 1.10\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":"crates/pyrefly_types/src/einops.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7a52c9e26e7d08f24e9704a3484cfc31f6e05f2a6c17b139382832757996399"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.tuple_infer: MethodTooLong \u2014 tuple_infer runs 110 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 10 over it, 1.10\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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1602}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f467bf8565db36dd076a8b8f2f377103de57e8a98fcdf107b704e1ca8fa3120"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.check_signature_consistency: MethodTooLong \u2014 check_signature_consistency runs 110 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 10 over it, 1.10\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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2240}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea018ed3ca0541a5c8392a15d4c9c61456b9959e9b1a9d795605e53cb9e49b13"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Subset.is_subset_tuple: MethodTooLong \u2014 is_subset_tuple runs 110 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 10 over it, 1.10\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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0b8fb1c093828f38e2c9b191955d159b77e6382bae0924034b4bbbc3aa137ff"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.resolve_class_attr_setter: MethodTooLong \u2014 resolve_class_attr_setter 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5355}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e2bb4c09ddef9a3dbf702d01634facc32a2d0101e5ceae0b01ac0e75cdbbea5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: whyPyreflyGridItem.WhyPyreflyGridItem: FunctionTooLong \u2014 WhyPyreflyGridItem runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"website/src/components/landing-page/whyPyreflyGridItem.tsx"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e68eb385684d5e5cecc1876820c65b2122ec67f749e948bc953230f0b3ab169"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: primer_classifier/classifier.py: FileTooLong \u2014 543 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"scripts/primer_classifier/classifier.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"075052d57f98bfd2a371305b24cd2d8549525983a33e61b88db4cbcd55c92757"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly_types::einops::evaluate_einops_pattern: FunctionTooLong \u2014 pyrefly_types::einops::evaluate_einops_pattern runs 108 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 8 over it, 1.08\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":"crates/pyrefly_types/src/einops.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"817021dd5604bcaa7e7927a9f9877aaaa5fdba970b3780c4a6fcecfc530e5805"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.check_consistent_multiple_inheritance: MethodTooLong \u2014 check_consistent_multiple_inheritance runs 108 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 8 over it, 1.08\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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":4523}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7f12a319a3086b1855b5c0732b47ad93eebdfc95b9d38c98a14a21835acd95a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: primer_classifier/llm_client.py: FileTooLong \u2014 538 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"scripts/primer_classifier/llm_client.py"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47b4d4c43330108139e15ae71b973730721c2230d5d89c0d868cdf0b759feba3"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: LspInteraction: ClassTooLong \u2014 429 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), 31 methods, 2 blocks, lines 1296-2046. The bar is 400 significant lines; this is 29 over it, 1.07\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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":1296}}}],"partialFingerprints":{"codehealthFindingId/v1":"9320355be5bfef1975d663213db8592a1422872c1052f8b0222e8ee409b1a008"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.parse_base_class: MethodTooLong \u2014 parse_base_class runs 107 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 7 over it, 1.07\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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1649}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bd45571d33b1d09a5ce176b00949e27d883eb7e22875a3f40af845e6d0932cb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.check_dict_items_against_typed_dict: MethodTooLong \u2014 check_dict_items_against_typed_dict runs 107 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 7 over it, 1.07\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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f561aba8a1044ea03e561d9dda22e28622894788916655f7cd8aa06d2b92c3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::lsp::non_wasm::server::capabilities: FunctionTooLong \u2014 pyrefly::lib::lsp::non_wasm::server::capabilities runs 107 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 7 over it, 1.07\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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1579}}}],"partialFingerprints":{"codehealthFindingId/v1":"134e8926a8fa8636cbc8aaab85a0858d2f5678aca703caa91b0a81a5427e5e21"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Transaction.identifier_from_covering_nodes: MethodTooLong \u2014 identifier_from_covering_nodes runs 107 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 7 over it, 1.07\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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":1016}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf3cd1d8826c853d48182870f3c2a505b9fa9c988d72f62a002b3e3c4d742ccc"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: pyrefly::lib::state::lsp::quick_fixes::extract_shared: TooManyFunctions \u2014 32 free functions. The bar is 30 free functions; this is 2 over it, 1.07\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":"pyrefly/lib/state/lsp/quick_fixes/extract_shared.rs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"b091ea3d880abd607cd4feeec945c6871b96f93afbe642603497ac588a0e2ec8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly_types::meta_shape_dsl::convert_call: FunctionTooLong \u2014 pyrefly_types::meta_shape_dsl::convert_call runs 106 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 6 over it, 1.06\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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1303}}}],"partialFingerprints":{"codehealthFindingId/v1":"f598fa68993344127887a568c1760ad8bf377be5556960a690a295ba6ff818db"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: report/pysa.rs: FileTooLong \u2014 528 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 28 over it, 1.06\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":"pyrefly/lib/report/pysa.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e065afdd775be9e570583dc4184267d4863d85127eb9af331f6917ff95bee99"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: state/errors.rs: FileTooLong \u2014 525 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 63% of them inside a single declaration: Errors (2 blocks, 280-840). The bar is 500 significant lines; this is 25 over it, 1.05\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":"pyrefly/lib/state/errors.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2135394460f35498dea675d0385ecf4285f33cebe9cb4c5b77ddff5ce3f4691"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.binding_to_type_unpacked_value: MethodTooLong \u2014 binding_to_type_unpacked_value runs 105 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 5 over it, 1.05\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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4820}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e133f304efe0aaa29be5f62924e72bf64b6cfd609eb5bd8ca891f0b66cbe08"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Binding: ClassTooLong \u2014 416 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), 1 methods, 3 blocks, lines 2494-3140. The bar is 400 significant lines; this is 16 over it, 1.04\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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":2494}}}],"partialFingerprints":{"codehealthFindingId/v1":"dedce64d70de3cf154a5bec25e4035e431ec6c30229bb89f1376e866be0f3dd9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.get_dataclass_init: MethodTooLong \u2014 get_dataclass_init 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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":1266}}}],"partialFingerprints":{"codehealthFindingId/v1":"007c88a04d1f5d0351de0f54efe7428f8bb87cf8afc0e30557b3f8ae4e88a6da"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.validate_type_var_default: MethodTooLong \u2014 validate_type_var_default 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3564}}}],"partialFingerprints":{"codehealthFindingId/v1":"571585f9cab4c88a5add600034aa4ebc9384a9040374f339d609a82a00fd2a4b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BindingsBuilder.bind_single_name_assign: MethodTooLong \u2014 bind_single_name_assign 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":"pyrefly/lib/binding/target.rs"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5e7975312cbfd26e65440362230dd59046caf2edb20b510a7dbe4b878c0e7ed"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::module::finder::find_import_with_mode: FunctionTooLong \u2014 pyrefly::lib::module::finder::find_import_with_mode 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":"pyrefly/lib/module/finder.rs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c6f99c61c1a1abbd459ed00dd794f5a6170e976f36867b8f3ddee8efa282770"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: ConfigFile: TooManyFields \u2014 31 stored fields beside 53 methods. The bar is 30 stored fields; this is 1 over it, 1.03\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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":579}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ac4141ea2f15ced661ae8cee897afcc668311532471c7c74db9b4b97e7a5c9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: LspInteraction: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":1296}}}],"partialFingerprints":{"codehealthFindingId/v1":"7405c1dfe6e662f44f390e91c41778618afe9af6e0e70a1122fe1bbd9c858a57"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Server.notebook_document_did_change: MethodTooLong \u2014 notebook_document_did_change runs 103 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 3 over it, 1.03\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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4181}}}],"partialFingerprints":{"codehealthFindingId/v1":"84540e26c42ba35bfb79f50cdc3b2f64ff42a933e39ebb1d0f20daab61a4fd54"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Subset.is_subset_eq_quantified: MethodTooLong \u2014 is_subset_eq_quantified runs 103 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 3 over it, 1.03\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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3563}}}],"partialFingerprints":{"codehealthFindingId/v1":"4af01099280964a184caeadc79b6d505555e545fb51d52e978ad83758f2f9d0d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CallGraphVisitor.resolve_name: MethodTooLong \u2014 resolve_name runs 102 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 2 over it, 1.02\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2378}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a528db5521ac9a7bd8c8d6350211b359f9eaf2a6773baab959a9c8d96657631"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/shape_type.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), about 80% of them inside a single declaration: BindingsBuilder (160-750). The bar is 500 significant lines; this is 6 over it, 1.01\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":"pyrefly/lib/binding/shape_type.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"507407a86d84a9f7cdb6e846a69eee1a5dc3e366b3c7e7b4d58e2170faefed96"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: binding/target.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), about 92% of them inside a single declaration: BindingsBuilder (51-829). The bar is 500 significant lines; this is 6 over it, 1.01\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":"pyrefly/lib/binding/target.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb540054ea8346974abf51c8062ad981088ff9ef11def3071f09d299eb8eefb1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.as_instance_attribute: MethodTooLong \u2014 as_instance_attribute runs 101 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 1 over it, 1.01\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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3511}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb4987e7858964d0a24a1dbd221662f5070b3a16820940b360faa1ea92f59230"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::alt::regex::validate_pattern: FunctionTooLong \u2014 pyrefly::lib::alt::regex::validate_pattern runs 101 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 1 over it, 1.01\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":"pyrefly/lib/alt/regex.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"6357228bb6be772ee5343f36cde3f0c07bc18bfbb365c60eecb44be2216f7dab"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AnswersSolver.check_args_and_construct_tuple: MethodTooLong \u2014 check_args_and_construct_tuple runs 101 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 1 over it, 1.01\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":"pyrefly/lib/alt/specials.rs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ddafacab38e26b4bf1ae956323b904625d4f02fdcd594cf8be538179a4ff301"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::state::lsp::quick_fixes::change_signature::change_signature_code_actions: FunctionTooLong \u2014 pyrefly::lib::state::lsp::quick_fixes::change_signature::change_signature_code_actions runs 101 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 1 over it, 1.01\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":"pyrefly/lib/state/lsp/quick_fixes/change_signature.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5006002600e6120271b6358057a1f02ba6adc00edf77cddfd514b1e46c552da"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: pyrefly::lib::state::lsp::quick_fixes::extract_function::extract_function_code_actions: FunctionTooLong \u2014 pyrefly::lib::state::lsp::quick_fixes::extract_function::extract_function_code_actions runs 101 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 1 over it, 1.01\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":"pyrefly/lib/state/lsp/quick_fixes/extract_function.rs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd34f0c68d74b8c5df826960668a5e4da5db3c6da3ecc7cceccb9875c74bac6c"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (26 shared lines): crates/pyrefly_types/src/type_level_dsl.rs:3568-3628 | crates/pyrefly_types/src/type_level_dsl.rs:3678-3721 \u2014 These two members are variants of one another: 26 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3568}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b0e86824096db9cae4aa0af0b5be2510db0d99803f52758d9be3af5ee309e99"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/microtorch/run_pyrefly.py:24-50 | tensor-shapes/pyrefly-einops-stubs/run_pyrefly.py:30-80 | tensor-shapes/pyrefly-jax-stubs/run_pyrefly.py:30-83 | tensor-shapes/pyrefly-numpy-stubs/run_pyrefly.py:29-79 | tensor-shapes/pyrefly-torch-stubs/run_pyrefly.py:29-85 \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":"tensor-shapes/microtorch/run_pyrefly.py"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2ddb461f17c1139874124f5f6a5863690d29653a6c80697199e7f4dc21505f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): crates/pyrefly_lsp_test/src/object_model.rs:972-995 | crates/pyrefly_lsp_test/src/object_model.rs:1002-1027 | crates/pyrefly_lsp_test/src/object_model.rs:1034-1067 | crates/pyrefly_lsp_test/src/object_model.rs:1075-1108 \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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":972}}}],"partialFingerprints":{"codehealthFindingId/v1":"68410f612bf6c500ca41de91602778af6d9ca19b2fb5dedc8566cae43e2af500"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): pyrefly/lib/alt/class/class_field.rs:869-879 | pyrefly/lib/alt/class/class_field.rs:881-891 | pyrefly/lib/alt/class/class_field.rs:971-983 | pyrefly/lib/alt/class/class_field.rs:1226-1238 \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":869}}}],"partialFingerprints":{"codehealthFindingId/v1":"db9eba28af28c2686b14bbec584aeff0a3b6e685f7a4d2cda79777954034e5f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (37\u201340 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/document_symbols.rs:89-128 | pyrefly/lib/lsp/non_wasm/document_symbols.rs:143-179 \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":"pyrefly/lib/lsp/non_wasm/document_symbols.rs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e1e3dcf37629c133a2fa4999530223b5132445684b30d46fdbbefd8c4e08c72"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (36 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/change_signature.rs:364-399 | pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs:490-525 \u2014 before extracting anything, compare \u0060pyrefly/lib/state/lsp/quick_fixes/change_signature.rs\u0060 and \u0060pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 58 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":"pyrefly/lib/state/lsp/quick_fixes/change_signature.rs"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"d96d63b387efa69d0c342c1a32948382e5183e2333fa8ce9de1d6bd0fb57e2d0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201333 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:6736-6768 | pyrefly/lib/lsp/non_wasm/server.rs:6893-6919 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":6736}}}],"partialFingerprints":{"codehealthFindingId/v1":"f930f0e7cb8e472ed51a61064d56ef9442b98b0355b60183d5ca3615275f8734"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28\u201330 lines \u00D7 2): pyrefly/lib/alt/narrow.rs:1497-1524 | pyrefly/lib/alt/narrow.rs:1573-1602 \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1497}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea2f78f329b4feac3ab7abf3f350edace7292e4a0de8dd8f6d0be502a99492f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2): pyrefly/lib/report/pysa/call_graph.rs:2299-2326 | pyrefly/lib/report/pysa/call_graph.rs:2330-2357 \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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2299}}}],"partialFingerprints":{"codehealthFindingId/v1":"3585e2a2fa3d394fe117efdf7e8f00ce44b7353e87141098086f46dfe0c07000"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): pyrefly/lib/report/cinderx/convert.rs:90-111 | pyrefly/lib/report/cinderx/convert.rs:381-402 \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":"pyrefly/lib/report/cinderx/convert.rs"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"d716cdede800fc065c60bf2598246593d1b140432ebf55a1fcd24836e873f6fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201321 lines \u00D7 2): crates/pyrefly_util/src/telemetry.rs:485-504 | crates/pyrefly_util/src/telemetry.rs:520-540 \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":"crates/pyrefly_util/src/telemetry.rs"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bda230a9b0afa7123c93625fd2d8e3f5294c1b33295a75419976bf8c22b1d87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): pyrefly/lib/alt/class/class_field.rs:923-943 | pyrefly/lib/alt/class/class_field.rs:945-965 \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":923}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4dfc2ea82221de5de1f39154ba696c5b57635cda6c2a75a83de57e8843db430"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): pyrefly/lib/commands/check.rs:1337-1356 | pyrefly/lib/lsp/non_wasm/type_error_display_status.rs:275-294 \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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":1337}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3cf89176e083c16f7717276af23be050dc566af115ff059cb4958079963a8d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 3): pyrefly/lib/alt/solve.rs:6411-6429 | pyrefly/lib/alt/solve.rs:6434-6452 | pyrefly/lib/alt/solve.rs:6627-6644 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6411}}}],"partialFingerprints":{"codehealthFindingId/v1":"c390337ab878878b9cf80283b3ef5cb910f0834bc734d0d4d771574822e7dd28"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): pyrefly/lib/alt/solve.rs:5593-5611 | pyrefly/lib/alt/solve.rs:5654-5672 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":5593}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ca913fccad6811d84cbce8e906476ce61f9c0d73bfae73b14179f8117ef27b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): crates/pyrefly_derive/src/type_eq.rs:31-49 | crates/pyrefly_derive/src/visit.rs:63-80 \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":"crates/pyrefly_derive/src/type_eq.rs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"941fdbb44f05c823e011e43b5839bbddcec6e25b56b613b20314ae35061b00ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3): pyrefly/lib/alt/narrow.rs:1717-1733 | pyrefly/lib/alt/narrow.rs:1744-1760 | pyrefly/lib/alt/narrow.rs:1776-1792 \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1717}}}],"partialFingerprints":{"codehealthFindingId/v1":"f09d361d238195a29fee87320330074cc9b5e5c89d124cef99fdd329aa00a391"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): crates/pyrefly_lsp_test/src/object_model.rs:1817-1833 | crates/pyrefly_lsp_test/src/object_model.rs:1859-1875 \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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":1817}}}],"partialFingerprints":{"codehealthFindingId/v1":"88aecb2b7a4cce2d9b292306a4925084dd4509e35953f59d60325f7aafd3712d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): crates/pyrefly_build/src/query.rs:53-68 | crates/pyrefly_build/src/source_db/buck_check.rs:110-125 \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":"crates/pyrefly_build/src/query.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"c262e8fe3ec1b32fdd1b1918ffab23b429f684446eb9b7b1bdb2bfaecae46a68"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): pyrefly/lib/binding/narrow.rs:793-808 | pyrefly/lib/binding/narrow.rs:826-841 \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":"pyrefly/lib/binding/narrow.rs"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"2846b94ebe1bcffa02c301f9a300a1e7cd106b5aae11629a8e61976b8eb58dc5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): pyrefly/lib/state/lsp.rs:2037-2052 | pyrefly/lib/state/lsp.rs:2068-2083 \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2037}}}],"partialFingerprints":{"codehealthFindingId/v1":"7856b44308f4e81133f6cb97253f55ac94be97a7b178a6c7ed70fedc2959ed86"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 3): pyrefly/lib/alt/solve.rs:1182-1196 | pyrefly/lib/alt/solve.rs:1207-1220 | pyrefly/lib/alt/solve.rs:1236-1249 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"45771ebd1db7e890bfe10338d59a3254fc9ece722cb7b6bc198ba972681e2083"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/pyrefly_types/src/display.rs:948-962 | crates/pyrefly_types/src/display.rs:964-978 \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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9154d9592d6fa9c939ccf192f651b099dc44d7b5ea98a573ac469a7909d311d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): pyrefly/lib/alt/attr.rs:2099-2113 | pyrefly/lib/alt/attr.rs:2200-2214 \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2099}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c4f47a6aa38f45b2d776ed61b1dfcad58353a4fa98474734dd541f6eb8cbd06"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): pyrefly/lib/alt/call.rs:2112-2126 | pyrefly/lib/alt/call.rs:2136-2150 \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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":2112}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bfef2577ba5b987089c057e6c5715aedfec79d4504a2a117e04df3131b5aba8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): pyrefly/lib/alt/class/pydantic.rs:658-672 | pyrefly/lib/alt/class/pydantic.rs:850-864 \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":"pyrefly/lib/alt/class/pydantic.rs"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"a60c8c7f6be720aab40a7fedb0fdbd3774b61f43c25792d2b76c2a7c13d6dd09"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 2): pyrefly/lib/alt/expr.rs:2231-2245 | pyrefly/lib/alt/expr.rs:2269-2282 \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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":2231}}}],"partialFingerprints":{"codehealthFindingId/v1":"48ae3a965195041d89ebf691a7c123b4c50d85de6052fd949e5e90bf04ff9b2e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): pyrefly/lib/report/pysa/ast_visitor.rs:345-359 | pyrefly/lib/report/pysa/ast_visitor.rs:453-467 \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":"pyrefly/lib/report/pysa/ast_visitor.rs"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4afda9dad61e9ef6e4ca0888a782c852040708d756574c06863834fcc6e2a3a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201314 lines \u00D7 3): pyrefly/lib/alt/solve.rs:1400-1413 | pyrefly/lib/alt/solve.rs:1423-1433 | pyrefly/lib/alt/solve.rs:1447-1457 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1400}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a4ffc649d03d79def952ad729e5deda61d027018e89d56697709e6f16becb3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/pyrefly_types/src/meta_shape_dsl.rs:1655-1668 | crates/pyrefly_types/src/meta_shape_dsl.rs:1726-1739 \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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1655}}}],"partialFingerprints":{"codehealthFindingId/v1":"e458cc4a7af0ed2d04b473603f9c92487489ec4f5989f702d2c38fd0f188fb51"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/alt/attr.rs:2867-2880 | pyrefly/lib/alt/attr.rs:2891-2904 \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2867}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fb65aaada8efc48643bd503ba30faf575adcf578f65907135e98030b062d37d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/alt/attr.rs:3220-3233 | pyrefly/lib/alt/attr.rs:3236-3250 \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":3220}}}],"partialFingerprints":{"codehealthFindingId/v1":"86dd8655762a9573655540aee88da88aebd98c97a6efa898f8a819022bed983f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/alt/class/dataclass.rs:496-509 | pyrefly/lib/alt/functools.rs:57-71 \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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb43cd7388d1d1a1f87bcf94010fbc2307526ab30164234fc9fca2d3b39b173f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/lsp/wasm/completion.rs:771-784 | pyrefly/lib/lsp/wasm/completion.rs:803-816 \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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"18733a45152c0e82e4c174f2903b059d71c8895f23bfc39ecb4e92b9d8e2abb0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 2): pyrefly/lib/lsp/wasm/completion.rs:901-912 | pyrefly/lib/state/lsp.rs:450-463 \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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":901}}}],"partialFingerprints":{"codehealthFindingId/v1":"fca0c72583b6300c60f4cb8165869dd21222b9156e8c6944da323af05e5e47b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/playground.rs:349-362 | pyrefly/lib/playground.rs:377-390 \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":"pyrefly/lib/playground.rs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c8849bc3cfa951a3b07e3f5a5d0d33bbddc677a40fb04baae2dc92f60996ee3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/solver/solver.rs:1116-1129 | pyrefly/lib/solver/solver.rs:1180-1193 \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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1116}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ff35ff936f965b071b94fd6300e975acf140a2f79bbbc809b33ff06f818385c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201313 lines \u00D7 2): pyrefly/lib/alt/class/variance_inference.rs:740-752 | pyrefly/lib/alt/class/variance_inference.rs:762-771 \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":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":740}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2ec478e2d32a2a727967f027af7a41e9f2f240bd1910fa4e5ff3cf1bc06304d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): pyrefly/lib/alt/unwrap.rs:276-288 | pyrefly/lib/alt/unwrap.rs:296-308 \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":"pyrefly/lib/alt/unwrap.rs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98e18f7fc9e047ba8bf7175a864f4734fd4115d243c4a89107238f3793d6a1d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201313 lines \u00D7 2): pyrefly/lib/commands/infer.rs:332-341 | pyrefly/lib/commands/stubgen.rs:62-74 \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":"pyrefly/lib/commands/infer.rs"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"32c79032bd8609bf5fbb325766247cd13335e8460ae58b39adbf38dd572a74af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): pyrefly/lib/query/type_table.rs:285-297 | pyrefly/lib/query/type_table.rs:442-454 \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":"pyrefly/lib/query/type_table.rs"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6dc71c99ed6ec06d43f148101f5c0a75431cfaeece27bbf133d6045a38df18b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/pyrefly_types/src/display.rs:1276-1287 | crates/pyrefly_types/src/display.rs:1492-1503 \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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":1276}}}],"partialFingerprints":{"codehealthFindingId/v1":"d765ac54aedd4b4b21b6fe219683408c5ad66d8e9cda0e6a94f222eff93b48de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/pyrefly_types/src/einsum.rs:239-250 | crates/pyrefly_types/src/einsum.rs:271-282 \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":"crates/pyrefly_types/src/einsum.rs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"949c6cc037d20ad90e886cd652e03fb3d4d4278b413a2a1fa91a9299c942724f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:6542-6553 | crates/pyrefly_types/src/type_level_dsl.rs:6565-6576 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6542}}}],"partialFingerprints":{"codehealthFindingId/v1":"2866d30879079003aa29e75b7eba149d75d50edb49bbe81a2e907fd154ee6de0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:7076-7087 | crates/pyrefly_types/src/type_level_dsl.rs:7153-7164 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7076}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8b9010cff922e1456f92bf676d4b0e5245b78a52cc60488aaea344e7b311742"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): pyrefly/lib/alt/class/class_field.rs:1195-1206 | pyrefly/lib/alt/class/class_field.rs:1211-1221 \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1195}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d3c312afd73e5e0ad1b0083e18280fb8a7470c4bbbe94cfda46a63661fb7947"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyrefly/lib/alt/function.rs:2772-2783 | pyrefly/lib/alt/function.rs:2822-2833 \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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2772}}}],"partialFingerprints":{"codehealthFindingId/v1":"1762633742163cba56fd91cc204667331df96770c8552401d58fb42dd3cd0f29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/workspace.rs:642-653 | pyrefly/lib/lsp/non_wasm/workspace.rs:677-688 \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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"43f9576d35e267f914736a3c7808bbf9a4a27e461d07467263add316d9a81530"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): pyrefly/lib/lsp/wasm/signature_help.rs:358-369 | pyrefly/lib/lsp/wasm/signature_help.rs:381-391 \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":"pyrefly/lib/lsp/wasm/signature_help.rs"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd35f2acd6340109273b1c08f1360b2ef1e7c22d15256bc83b131e0ac387370c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyrefly/lib/report/cinderx.rs:169-180 | pyrefly/lib/report/cinderx.rs:201-212 \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":"pyrefly/lib/report/cinderx.rs"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fc545abcd7d57b0a61e410d4c373f3cfcbbb7fe7f59ee883aaa1ec230e35268"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyrefly/lib/state/lsp.rs:1029-1040 | pyrefly/lib/state/lsp.rs:1063-1074 \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":1029}}}],"partialFingerprints":{"codehealthFindingId/v1":"28dde27146cdf9db85826307be4863a30ca51bacfffce8115afd955656816987"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyrefly/lib/state/lsp.rs:3622-3633 | pyrefly/lib/state/lsp.rs:3649-3660 \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":3622}}}],"partialFingerprints":{"codehealthFindingId/v1":"315c4fcbc49523b7da3b963daddba75e5dd41b1b8d759a9e28b3780345992ec2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): crates/pyrefly_lsp_test/src/object_model.rs:423-433 | crates/pyrefly_lsp_test/src/object_model.rs:441-451 | crates/pyrefly_lsp_test/src/object_model.rs:459-469 \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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6bcfa04af787174d8569f49ba479af30c47dff73a011da769811b5d310adab8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): pyrefly/lib/query/type_table.rs:284-294 | pyrefly/lib/query/type_table.rs:441-451 | pyrefly/lib/query/type_table.rs:513-523 \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":"pyrefly/lib/query/type_table.rs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"e00c2a5bc4ea88f5360cbe22036f5867a9aced687b154c2682a7ac2522dce236"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/pyrefly_lsp_test/src/object_model.rs:544-554 | crates/pyrefly_lsp_test/src/object_model.rs:585-595 \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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a9c9dc24075c022e63e44e38c06d22f54bab977cf3214544bf6bf2a89510914"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/pyrefly_types/src/shape_index.rs:100-110 | crates/pyrefly_types/src/shape_index.rs:289-299 \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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0e2beec0f785a595af1252bfa768efaebec32ae65a3d705834f007fd531e01"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:2605-2615 | crates/pyrefly_types/src/type_level_dsl.rs:3794-3802 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2605}}}],"partialFingerprints":{"codehealthFindingId/v1":"74998eec770b16d40bcff96b1c7977372728b8736f209b22aad1be72d72b6328"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/alt/solve.rs:1435-1445 | pyrefly/lib/alt/solve.rs:1459-1469 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1435}}}],"partialFingerprints":{"codehealthFindingId/v1":"019fa5e94fb77fca6109981d7eddd1154afd8478d2dda6b88940863cf9600105"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201311 lines \u00D7 2): pyrefly/lib/alt/solve.rs:5577-5587 | pyrefly/lib/alt/solve.rs:5641-5648 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":5577}}}],"partialFingerprints":{"codehealthFindingId/v1":"db977dcadb7a997fe43d1b7b13560c589d06affc016ddad58889789091b01f7e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/export/exports.rs:355-365 | pyrefly/lib/export/exports.rs:378-388 \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":"pyrefly/lib/export/exports.rs"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"b19d5d0289b35eb1f00a7ace10db53a087bcd51848d49eb2b9acf95f3f937d08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u201311 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:3780-3786 | pyrefly/lib/lsp/non_wasm/server.rs:3821-3831 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":3780}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aae73c63a4e855e498b2495f65e0af461ebcf8216a94f5d158b3949038d8948"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:4129-4139 | pyrefly/lib/lsp/non_wasm/server.rs:4205-4215 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4129}}}],"partialFingerprints":{"codehealthFindingId/v1":"f74ce2dc89bcc97f8a4545e05d880ef04ec6f30f93c4aa146a7eb5a0666fb170"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/workspace.rs:693-703 | pyrefly/lib/lsp/non_wasm/workspace.rs:708-718 \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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":693}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb50bf644406436f5c8ee5d943ee3bf7b2002e5478022c88b7862f8f1565e5da"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/change_signature.rs:401-411 | pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs:527-537 \u2014 before extracting anything, compare \u0060pyrefly/lib/state/lsp/quick_fixes/change_signature.rs\u0060 and \u0060pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 58 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":"pyrefly/lib/state/lsp/quick_fixes/change_signature.rs"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"546829014df03a15e739ee6b8425a7da260cd74e8a9025a7cc5f09eb647ce934"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/state/lsp.rs:3375-3385 | pyrefly/lib/state/lsp.rs:3387-3397 \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":3375}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8e2f3ff56e32de6ff344fa71af73d6d7877e1c1c39de9649a3a6303e86104a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/stubgen/extract.rs:356-366 | pyrefly/lib/stubgen/extract.rs:385-395 \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":"pyrefly/lib/stubgen/extract.rs"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"1959dabdf2f3e652e51ac9a67a79bfd15388d6a62e07736a2daf15ecd9a8408f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/report/cinderx/display.rs:26-36 | pyrefly/lib/report/cinderx/display.rs:61-71 \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":"pyrefly/lib/report/cinderx/display.rs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e01f8aed2f029d339c7d5cab6d9cca798b533aafe8bc2b63da62e21eb5e5962a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): crates/pyrefly_types/src/type_level_dsl.rs:3580-3589 | crates/pyrefly_types/src/type_level_dsl.rs:3651-3660 | crates/pyrefly_types/src/type_level_dsl.rs:3681-3690 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3580}}}],"partialFingerprints":{"codehealthFindingId/v1":"416b2f48f0274e184090b59cfdff89763102ca78485a58e8131ab4f251ba4dde"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): crates/pyrefly_types/src/type_level_dsl.rs:6913-6922 | crates/pyrefly_types/src/type_level_dsl.rs:6974-6983 | crates/pyrefly_types/src/type_level_dsl.rs:7030-7039 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6913}}}],"partialFingerprints":{"codehealthFindingId/v1":"65512ee61460a1a982d9cc0b06c02f049e25c771744ad178c37235a472ecba9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/pyrefly_types/src/display.rs:1495-1504 | crates/pyrefly_types/src/display.rs:1520-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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":1495}}}],"partialFingerprints":{"codehealthFindingId/v1":"279e16c39fbd9aca5b2ccadd1d10e3af35c2ee520758edfa08d1736057d8ccf3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:2574-2583 | crates/pyrefly_types/src/type_level_dsl.rs:2838-2847 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2574}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebab96f9138bec0471232008d5b1a397314582ecd1eb25b0273efc341af57ecd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/binding/attrs.rs:140-149 | pyrefly/lib/binding/attrs.rs:162-171 \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":"pyrefly/lib/binding/attrs.rs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"79983140f101619f2de08450aef80c509a7180bcc53e71a532f81a7346d98056"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u201310 lines \u00D7 2): pyrefly/lib/binding/class.rs:1326-1335 | pyrefly/lib/binding/class.rs:1386-1391 \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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":1326}}}],"partialFingerprints":{"codehealthFindingId/v1":"613c7ab29de2494cf2d27b4602f3739f5c3997cb461ee4126642f9ac2f533ef3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/commands/check.rs:788-797 | pyrefly/lib/commands/check.rs:804-813 \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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":788}}}],"partialFingerprints":{"codehealthFindingId/v1":"f055813fb7c822903f49b2346bcb06041ce61787eebee244a0a68b3da059678c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): pyrefly/lib/commands/infer.rs:344-352 | pyrefly/lib/commands/stubgen.rs:74-83 \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":"pyrefly/lib/commands/infer.rs"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0a0592eeb2886b2349d3d9f0fc3ca757e17fd03478be42919b9779db07ae2f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:4761-4770 | pyrefly/lib/lsp/non_wasm/server.rs:4788-4797 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4761}}}],"partialFingerprints":{"codehealthFindingId/v1":"d78b42f0e9175d029e8a40a340b17883da4245a7da124fe1c2f1581613d77188"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/solver/solver.rs:3652-3661 | pyrefly/lib/solver/solver.rs:3663-3672 \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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3652}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d47af39f1e45112a8f3f41eaa643411f390caf496cbf312e9782724e38dd11"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/solver/subset.rs:925-934 | pyrefly/lib/solver/subset.rs:939-948 \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":925}}}],"partialFingerprints":{"codehealthFindingId/v1":"49cb795934d3b697cbcf25125f7c8b3d7968542fa5973c1a3f697c4ac557ba76"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/state/lsp/dict_completions.rs:503-512 | pyrefly/lib/state/lsp/dict_completions.rs:701-710 \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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a90938367626fe9a83dc906ea6b27e086e388744210cb2ecc6c6019bf4b7b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/stubgen/extract.rs:602-611 | pyrefly/lib/stubgen/extract.rs:620-629 \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":"pyrefly/lib/stubgen/extract.rs"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cc8113219e06daa988e8004dbc2233b5c9ac5945369c013e3253fcd06d911ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 5): pyrefly/lib/lsp/non_wasm/server.rs:2423-2431 | pyrefly/lib/lsp/non_wasm/server.rs:2498-2506 | pyrefly/lib/lsp/non_wasm/server.rs:2794-2802 | pyrefly/lib/lsp/non_wasm/server.rs:2809-2817 | pyrefly/lib/lsp/non_wasm/server.rs:2839-2847 \u2014 all 5 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":2423}}}],"partialFingerprints":{"codehealthFindingId/v1":"39ceacbfdae4541ed35780e53361c75d79dbf3bdf03090a5af34acdcde006f74"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 3): pyrefly/lib/alt/solve.rs:4254-4261 | pyrefly/lib/alt/solve.rs:4270-4277 | pyrefly/lib/alt/solve.rs:4287-4295 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4254}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6b3693bd0f89387c15f23fcb8be4b52b462b5f7e0637418f769727620d7d267"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): pyrefly/lib/lsp/non_wasm/workspace.rs:661-669 | pyrefly/lib/lsp/non_wasm/workspace.rs:692-700 | pyrefly/lib/lsp/non_wasm/workspace.rs:707-715 \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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":661}}}],"partialFingerprints":{"codehealthFindingId/v1":"036db5d8250424ace6261b77ada86d8b084187a3694d59b64b121dcf3dc512d8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): pyrefly/lib/stubgen/extract.rs:336-344 | pyrefly/lib/stubgen/extract.rs:355-363 | pyrefly/lib/stubgen/extract.rs:384-392 \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":"pyrefly/lib/stubgen/extract.rs"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"8818b5363b1d9bb3a311151cd52d377752d3626168ad54186c22445e2e57b695"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): pyrefly/lib/lsp/non_wasm/convert_module_package.rs:37-45 | pyrefly/lib/lsp/non_wasm/move_symbol_new_file.rs:54-62 | pyrefly/lib/lsp/non_wasm/safe_delete_file.rs:39-47 \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":"pyrefly/lib/lsp/non_wasm/convert_module_package.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecf9ba7a1b6416f56210c98dbf90c64796ac30bc2ce1f024c1bb244a6f958e82"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): crates/pyrefly_types/src/display.rs:434-441 | crates/pyrefly_types/src/display.rs:486-494 \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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd963ea480a51807952bd82832a414227dc208269e2557a77c78ac5229f2a060"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:3599-3607 | crates/pyrefly_types/src/type_level_dsl.rs:3700-3708 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3599}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3809203030b6e02d8c92279eca18773f8c899d6544d3e82d4cd3364a9ee4bf9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:6385-6393 | crates/pyrefly_types/src/type_level_dsl.rs:6397-6404 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6385}}}],"partialFingerprints":{"codehealthFindingId/v1":"f811f8d5a6372a989ec6ca7be00438ae802eafd60eaa3983c78ec1f4ddd9d003"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:7553-7561 | crates/pyrefly_types/src/type_level_dsl.rs:7591-7599 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7553}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1dd37df299f22f0fadb9d53d68d906f15fcc14b311687581d3a9bf04cf75424"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/alt/call.rs:621-629 | pyrefly/lib/alt/call.rs:644-652 \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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"8938ec29304f4fb76c89e84e98b511d55c845554fdbe09f357be8c4b82b38b5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/alt/class/class_field.rs:871-879 | pyrefly/lib/alt/class/class_field.rs:883-891 \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":871}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f67823b6621b17409961485bb6e311a292cee64290d61ae678d78b238b030b0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/alt/narrow.rs:1376-1384 | pyrefly/lib/alt/narrow.rs:1398-1406 \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1376}}}],"partialFingerprints":{"codehealthFindingId/v1":"66f14991cdf846a53e6221d1fa9361d828f024ed163c0b0c0f5d42dabd6bc063"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/alt/overload.rs:956-964 | pyrefly/lib/alt/overload.rs:965-973 \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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":956}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbdf28ec1e3ac646724e34c248e8202e2139c21a6a9a6087cee7c24e10cb7d12"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/alt/solve.rs:1222-1230 | pyrefly/lib/alt/solve.rs:1431-1439 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1222}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6594f92bce4522e722deed3db25f90278898c0692cacc8b94513219edeeee38"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/alt/solve.rs:1251-1259 | pyrefly/lib/alt/solve.rs:1455-1463 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1251}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f2429d1beac7bca8bd7f018e0cfff4aeed4fc1567e5dc2c721578002fdfe4d3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): pyrefly/lib/binding/stmt.rs:416-423 | pyrefly/lib/binding/stmt.rs:541-549 \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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"09428cd61c10462c2847c2e5451c85682ba2a56b96f2567ed8080221f0326b33"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/lsp/wasm/inlay_hints.rs:679-687 | pyrefly/lib/state/lsp.rs:1191-1199 \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":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":679}}}],"partialFingerprints":{"codehealthFindingId/v1":"177e3f9f66f15678db41da7d751ab14b38e55d3253a73f1a166d378afbc7f8e0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/report/pysa.rs:641-649 | pyrefly/lib/report/pysa.rs:669-677 \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":"pyrefly/lib/report/pysa.rs"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba98b96ded560f9870f31cc01c2b195d95f6afa9e67483dfb0cfe1629871d308"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/report/pysa.rs:651-659 | pyrefly/lib/report/pysa.rs:663-671 \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":"pyrefly/lib/report/pysa.rs"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"09abe93d2bc78ee54de5fe46c69d6681a413a56564b1ae5b78079f768d20e364"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5\u20139 lines \u00D7 2): pyrefly/lib/solver/subset.rs:2698-2706 | pyrefly/lib/solver/subset.rs:2711-2715 \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":2698}}}],"partialFingerprints":{"codehealthFindingId/v1":"856e799ec6c053af5c05cdb4144fc4d82b56086d7dad2a52a3186dd9b0353d53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/convert_dict.rs:309-317 | pyrefly/lib/state/lsp/quick_fixes/convert_dict.rs:343-351 \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":"pyrefly/lib/state/lsp/quick_fixes/convert_dict.rs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7aa687bce03bc07a3100b5c3c3fe8bc9daf16755585d2e128e559243cfb3ed7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/state/semantic_tokens.rs:573-581 | pyrefly/lib/state/semantic_tokens.rs:582-590 \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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":573}}}],"partialFingerprints":{"codehealthFindingId/v1":"634b2319215b3146f2989282c746d1ee8c599d790f0934cbb6e0b5efff57fa47"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/lsp.rs:27-35 | pyrefly/lib/lsp/non_wasm/lsp.rs:42-50 \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":"pyrefly/lib/lsp/non_wasm/lsp.rs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"f00ad27389661ec846c3581a18ae13f2581e17c7de3d748d16609b8234784829"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/pyrefly_ignore.rs:33-41 | pyrefly/lib/state/lsp/quick_fixes/pyrefly_ignore.rs:47-55 \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":"pyrefly/lib/state/lsp/quick_fixes/pyrefly_ignore.rs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"7af6f70eef4085e06dc8f3bbc01ab46fd8be0dc10f6e7cba5d4cf80fafd4f21f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 11): pyrefly/lib/lsp/non_wasm/server.rs:2377-2384 | pyrefly/lib/lsp/non_wasm/server.rs:2409-2416 | pyrefly/lib/lsp/non_wasm/server.rs:2484-2491 | pyrefly/lib/lsp/non_wasm/server.rs:2569-2576 | pyrefly/lib/lsp/non_wasm/server.rs:2604-2611 | pyrefly/lib/lsp/non_wasm/server.rs:2631-2638 | pyrefly/lib/lsp/non_wasm/server.rs:2646-2653 | pyrefly/lib/lsp/non_wasm/server.rs:2661-2668 | pyrefly/lib/lsp/non_wasm/server.rs:2765-2772 | pyrefly/lib/lsp/non_wasm/server.rs:2780-2787 | pyrefly/lib/lsp/non_wasm/server.rs:2825-2832 \u2014 all 11 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":2377}}}],"partialFingerprints":{"codehealthFindingId/v1":"38d6165d971834cdcf766cfd5e6a37e2a3c0788e4263f05118bdb33e8af71e69"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 6): pyrefly/lib/alt/narrow.rs:1372-1379 | pyrefly/lib/alt/narrow.rs:1394-1401 | pyrefly/lib/alt/narrow.rs:1416-1423 | pyrefly/lib/alt/narrow.rs:1429-1436 | pyrefly/lib/alt/narrow.rs:1445-1452 | pyrefly/lib/alt/narrow.rs:1461-1468 \u2014 all 6 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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1372}}}],"partialFingerprints":{"codehealthFindingId/v1":"25688507ce0567620eb79e170745c87bbe3773fe99bf48b8478a4c536aaf2c5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): crates/pyrefly_lsp_test/src/object_model.rs:693-700 | crates/pyrefly_lsp_test/src/object_model.rs:704-711 | crates/pyrefly_lsp_test/src/object_model.rs:715-722 \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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":693}}}],"partialFingerprints":{"codehealthFindingId/v1":"31ab773990dec822a3296355c3b1b20b60c7355ea0f62d039e5d7b7d66a56e0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/pyrefly_types/src/callable.rs:680-687 | crates/pyrefly_types/src/callable.rs:694-701 \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":"crates/pyrefly_types/src/callable.rs"},"region":{"startLine":680}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b81c40534a6656e87295b3c2f77c22b5a7891345453dd36f7e802ed9921272"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/pyrefly_types/src/dimension.rs:1023-1030 | crates/pyrefly_types/src/dimension.rs:1034-1043 \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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":1023}}}],"partialFingerprints":{"codehealthFindingId/v1":"35ea38498dd2b59fb4901ef0896c3846a04ad742784d894e3fd6846a7b04958b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/pyrefly_types/src/dimension.rs:1403-1410 | crates/pyrefly_types/src/dimension.rs:1420-1427 \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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":1403}}}],"partialFingerprints":{"codehealthFindingId/v1":"facb2b34042433dbbcee9d8772b7b2ad9d8a1498cae88efdb5c33ca59c152cc1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/pyrefly_types/src/meta_shape_dsl.rs:1762-1769 | crates/pyrefly_types/src/meta_shape_dsl.rs:1780-1787 \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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":1762}}}],"partialFingerprints":{"codehealthFindingId/v1":"d64cdcd7af9424355e66ea8c1a7d68eb1e8d75eab7c575726185cdd3c79641ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/alt/attr.rs:2113-2120 | pyrefly/lib/alt/attr.rs:2133-2140 \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2113}}}],"partialFingerprints":{"codehealthFindingId/v1":"a397764f6c562ff16487967f83e96e40159da2f38a1abfb2d0691226083fda17"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/alt/class/class_field.rs:860-867 | pyrefly/lib/alt/class/class_field.rs:1179-1189 \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":860}}}],"partialFingerprints":{"codehealthFindingId/v1":"682e1415b1b9e967b6ce9af967f69b1cba28cb643c003975bc4e72c0a3f117c4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/alt/narrow.rs:474-481 | pyrefly/lib/alt/narrow.rs:1852-1860 \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea7e4540f17f29c7ce520eacb2a5b0c19dd8da3e3c087204482b3b1da852b2a1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/alt/narrow.rs:1210-1217 | pyrefly/lib/alt/narrow.rs:1226-1233 \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1210}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab7619e49588fa25a456828b660c7f5abe3f9bc998f53422f30e6e2ea236be0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/alt/operators.rs:304-311 | pyrefly/lib/alt/operators.rs:318-325 \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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab4fa440d25d8f09cae937044472dafc7900aa1d149c7dcc6129aad265848de9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/alt/unwrap.rs:223-230 | pyrefly/lib/alt/unwrap.rs:272-279 \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":"pyrefly/lib/alt/unwrap.rs"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba78751e2777787ec8b7aba4a3c391dbadc4e585bf9b1ce97884c5387d3eed2e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/alt/unwrap.rs:292-299 | pyrefly/lib/alt/unwrap.rs:465-472 \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":"pyrefly/lib/alt/unwrap.rs"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0c26a918f523ad1ceaeb5f37ae2e343e440cbb3391c5e63529270ee6d839015"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/binding/expr.rs:971-978 | pyrefly/lib/binding/expr.rs:991-998 \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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":971}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6330e34adbdc8fd617762b2924f2f7fee1b7e263d837de0ceb9a8d76e79c23a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/binding/narrow.rs:853-860 | pyrefly/lib/binding/narrow.rs:874-881 \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":"pyrefly/lib/binding/narrow.rs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"82f6dadb306a9c36e9c0c32ff31f0b07b659df74c539d37039f07497c71a06a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/commands/init.rs:301-308 | pyrefly/lib/commands/init.rs:347-354 \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":"pyrefly/lib/commands/init.rs"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf23a7df16950109a226fdf1098173637dd0fd446ec3394dab3a0c78f9f38b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:2394-2401 | pyrefly/lib/lsp/non_wasm/server.rs:2516-2523 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":2394}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4559144df74d977f07ed44b42daaf7c943fbde85cc6501a90395a5b2d7984f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:6006-6013 | pyrefly/lib/lsp/non_wasm/server.rs:6059-6066 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":6006}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f8bf9411454486308973f9238528a85f5300eee343f121be04957c92101bf7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): pyrefly/lib/state/semantic_tokens.rs:491-497 | pyrefly/lib/state/semantic_tokens.rs:499-505 | pyrefly/lib/state/semantic_tokens.rs:507-513 | pyrefly/lib/state/semantic_tokens.rs:515-521 \u2014 all 4 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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a9f2495a799095d5d82f3efdcf5fea3bf7a2a74677651203262af6309701075"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): pyrefly/lib/alt/attr.rs:2115-2121 | pyrefly/lib/alt/attr.rs:2135-2141 | pyrefly/lib/alt/attr.rs:2216-2222 \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2115}}}],"partialFingerprints":{"codehealthFindingId/v1":"c90814a9f698d80f2a85046708d4d25ab1743b8b9cf033cc35bf9798175ab17f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): pyrefly/lib/state/lsp/quick_fixes/extract_field.rs:42-48 | pyrefly/lib/state/lsp/quick_fixes/extract_variable.rs:37-43 | pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs:98-104 \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":"pyrefly/lib/state/lsp/quick_fixes/extract_field.rs"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f20a1752d00e9d3227124a26241585eba4e31f25a85abd346337e91929db2c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): pyrefly/lib/report/cinderx/display.rs:25-32 | pyrefly/lib/report/cinderx/display.rs:61-67 | pyrefly/lib/report/cinderx/display.rs:85-91 \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":"pyrefly/lib/report/cinderx/display.rs"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba8154005b1e655f0945d4b82aaf14a37c81f64d9e241f085dde5947dd815e1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/pyrefly_config/src/migration/run.rs:394-400 | pyrefly/lib/commands/init.rs:321-327 \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":"crates/pyrefly_config/src/migration/run.rs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"a15c20da2ad7fa132de08f0e37ffb6a5e9e4149e572ec66e43ce8f10ca72bdca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/pyrefly_types/src/dimension.rs:728-734 | crates/pyrefly_types/src/dimension.rs:921-927 \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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":728}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3ea1b2022121526d417dda31549e6f0e3083b18eaf3ea048aa78fcbe87ed301"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/pyrefly_types/src/display.rs:1377-1383 | crates/pyrefly_types/src/display.rs:1393-1399 \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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":1377}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4208cb3ce78b45c85d4506be7c06897e78400d7f9ce56b708161b6e87f53e28"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:3591-3597 | crates/pyrefly_types/src/type_level_dsl.rs:3692-3698 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3591}}}],"partialFingerprints":{"codehealthFindingId/v1":"afc95f7c45c4d2222ca28a5c49e3803235b20d6421df85b15fbcd529d294a972"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:7489-7495 | crates/pyrefly_types/src/type_level_dsl.rs:7520-7526 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7489}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdbe4916fb4281faf000a6634485855259b982a9f4032c47b42594616776c17f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/alt/narrow.rs:1131-1137 | pyrefly/lib/alt/narrow.rs:1154-1160 \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1131}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a07bceb15ca8046ce8266e4625fda6704e621e44b7cfc6be0a50e714dddfad8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/alt/solve.rs:3628-3634 | pyrefly/lib/alt/solve.rs:3636-3642 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3628}}}],"partialFingerprints":{"codehealthFindingId/v1":"e636a7260bbc4a57bad2c0537cb132049c070c019daaec39040d51462bdc7e71"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/binding/scope.rs:2402-2408 | pyrefly/lib/binding/scope.rs:2464-2470 \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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":2402}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5ab42d8302c74e981f2ef5260a0cb51cbcbb3a8a954e96924a785ea5222476"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:4784-4790 | pyrefly/lib/lsp/non_wasm/server.rs:4813-4819 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4784}}}],"partialFingerprints":{"codehealthFindingId/v1":"64e05ff59160045504a1bf7ad96ed525c56025073d8984f729e629f1f679d59a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:6002-6008 | pyrefly/lib/playground.rs:526-532 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":6002}}}],"partialFingerprints":{"codehealthFindingId/v1":"b16dd63b3cb59c3e9c0d2d37a49be67b74cea77f7405a995468e3f64b0da7063"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:6055-6061 | pyrefly/lib/playground.rs:496-502 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":6055}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd290d64dcd35cb1e6d96b9fed5aa11c3adcf71eb0f47bbb90f12c822735c12a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (4\u20137 lines \u00D7 3): pyrefly/lib/playground.rs:473-476 | pyrefly/lib/playground.rs:500-506 | pyrefly/lib/playground.rs:530-536 \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":"pyrefly/lib/playground.rs"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"06363259ba215cdd843de55ecab7cd4ec05532014fbfbd04c748d3245cffa3b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/solver/subset.rs:860-866 | pyrefly/lib/solver/subset.rs:893-899 \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":860}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0da956451ec0477516b83fc99b0636c63cb89d0d545f965c3943665a9c89592"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): pyrefly/lib/solver/subset.rs:2072-2077 | pyrefly/lib/solver/subset.rs:2098-2104 \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":2072}}}],"partialFingerprints":{"codehealthFindingId/v1":"279a0ee05834d97151ffad52e277a28e074f7a3514fab960a27a571df434a198"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/state/lsp/dict_completions.rs:668-674 | pyrefly/lib/state/lsp/dict_completions.rs:704-710 \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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":668}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0979755e32b446df9de71d423878957e4969db40102642559437326d7528006"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/report/pysa/capnp_writer.rs:466-472 | pyrefly/lib/report/pysa/capnp_writer.rs:510-516 \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":"pyrefly/lib/report/pysa/capnp_writer.rs"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"edefa8f27e8b9d0d2cf18d686c49e48af7df7ad0fbac75461cbcbbf0358d90af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/report/pysa/capnp_writer.rs:545-551 | pyrefly/lib/report/pysa/capnp_writer.rs:563-569 \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":"pyrefly/lib/report/pysa/capnp_writer.rs"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"e379429ab4a7a788da850103bc52ac3d8cc9a301ae75b747e63f0bb0375e3644"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4): pyrefly/lib/alt/class/class_field.rs:870-875 | pyrefly/lib/alt/class/class_field.rs:882-887 | pyrefly/lib/alt/class/class_field.rs:972-977 | pyrefly/lib/alt/class/class_field.rs:1227-1232 \u2014 all 4 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d2c01fe8a2b83a5659a458ebbce28f488a5c7092aa0555e64da4febcbdba20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/pyrefly_config/src/args.rs:507-512 | crates/pyrefly_config/src/args.rs:514-519 | crates/pyrefly_config/src/args.rs:521-526 \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":"crates/pyrefly_config/src/args.rs"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c52680f2315dbd818b8849e58c89243007ce17ae8de5123f9dc7e8a544b42ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): crates/pyrefly_types/src/type_level_dsl.rs:6890-6895 | crates/pyrefly_types/src/type_level_dsl.rs:7488-7493 | crates/pyrefly_types/src/type_level_dsl.rs:7519-7524 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6890}}}],"partialFingerprints":{"codehealthFindingId/v1":"4080da15472f46b90c24fd2c20220c74bc66edaa1a90a72243d5c5dc173d6036"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/pyrefly_types/src/meta_shape_dsl.rs:905-910 | crates/pyrefly_types/src/meta_shape_dsl.rs:921-926 \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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":905}}}],"partialFingerprints":{"codehealthFindingId/v1":"760038d4dfeeb9d99663aba51adf3bd44cc87fba6f9228864bed85d9797df9f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:3550-3555 | crates/pyrefly_types/src/type_level_dsl.rs:4604-4609 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3550}}}],"partialFingerprints":{"codehealthFindingId/v1":"1149773ec5643a43d58397f29f1e09d3ae456f8ac6d642417919003ab3f36c6f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:7502-7507 | crates/pyrefly_types/src/type_level_dsl.rs:7541-7546 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7502}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ca67ddce97a5928873b5b6cb6672e2f217154a973d249b34bae3f0e98ad26f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/alt/attr.rs:2691-2696 | pyrefly/lib/alt/attr.rs:2864-2869 \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2691}}}],"partialFingerprints":{"codehealthFindingId/v1":"06fb4b1f82dde8f35797c550598a5fda738d21df39a7b23e1586ba8c7a2b7556"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/alt/expr.rs:4011-4016 | pyrefly/lib/alt/expr.rs:4042-4048 \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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":4011}}}],"partialFingerprints":{"codehealthFindingId/v1":"a88a293013c6f02163f7ed88adb1cbf58db163674cf6a86ba1a3a7b1e18d80cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/alt/function.rs:2761-2766 | pyrefly/lib/alt/function.rs:2851-2856 \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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2761}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3d86d56ea998285111f0caf1c42f2a2fc5b7d10ea3ece0ab38ae4c6e6037d0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/alt/narrow.rs:2402-2409 | pyrefly/lib/alt/narrow.rs:2467-2472 \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":2402}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a5b3cd7bb2a3b46c55e3a36302d7469f4c8c27c8610a1c69690c2a5aeafd6bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/alt/polars_specials.rs:1221-1226 | pyrefly/lib/alt/polars_specials.rs:1631-1636 \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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":1221}}}],"partialFingerprints":{"codehealthFindingId/v1":"a310afaf5556105988fc55009afd4ecdd5249a799e9e2f4f22ec66d1e0535a29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/alt/solve.rs:4246-4251 | pyrefly/lib/alt/solve.rs:4279-4284 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4246}}}],"partialFingerprints":{"codehealthFindingId/v1":"1442f5b9922dda5d8bcc8047c791f1c294450e5e946a084bd0bba973968f129a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/binding/expr.rs:1154-1159 | pyrefly/lib/binding/expr.rs:1161-1166 \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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":1154}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a1ff903e85154f10177480da7d3765370ebb942d6a42c3f037667bed6d5d69a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/export/definitions.rs:333-338 | pyrefly/lib/export/deprecation.rs:20-25 \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":"pyrefly/lib/export/definitions.rs"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ed8248b1518167529322048d351a0e2035cdad9e29263295a00403dc73e3d57"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/solver/subset.rs:498-503 | pyrefly/lib/solver/subset.rs:509-514 \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0e2fd79cfe8f3c927c7d6ddc766427ffe24fc6e1ab54849463d1cc61d50d07e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/convert_dict.rs:302-307 | pyrefly/lib/state/lsp/quick_fixes/convert_dict.rs:336-341 \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":"pyrefly/lib/state/lsp/quick_fixes/convert_dict.rs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"52b47416b4dd893ea297032057c7c218dcdcfe5ec7eaabc3fe079fbde8f751c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/convert_star_import.rs:171-176 | pyrefly/lib/state/lsp/quick_fixes/extract_shared.rs:486-491 \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":"pyrefly/lib/state/lsp/quick_fixes/convert_star_import.rs"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"c04ce9de2d8392c41eb145aa6f86c352b818a734e560043b98d1d38b355f94bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/report/pysa/capnp_writer.rs:374-379 | pyrefly/lib/report/pysa/capnp_writer.rs:388-393 \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":"pyrefly/lib/report/pysa/capnp_writer.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c50bc5b26f1c02ac0452e982767f37a9eaabe5bafc0f6879786865d4fed5717"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pyrefly/lib/report/pysa/capnp_writer.rs:655-660 | pyrefly/lib/report/pysa/capnp_writer.rs:722-727 \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":"pyrefly/lib/report/pysa/capnp_writer.rs"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fbb323996136d60040d6dbf8b63ca19619e92ca70d5ccebb3c6b4221354ff4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_python/src/ignore.rs:658-662 | crates/pyrefly_python/src/ignore.rs:800-804 \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":"crates/pyrefly_python/src/ignore.rs"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"be6868dbaa320b6cacb320cfb32e430519062b70101fb1e840a96dd7856d932f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_types/src/meta_shape_dsl.rs:2487-2491 | crates/pyrefly_types/src/meta_shape_dsl.rs:2494-2498 \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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2487}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a547c37765727c7d1f4d5a408b6dd5102c5828c0cfe747edbfa814c35ab9c9c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_types/src/meta_shape_dsl.rs:2959-2965 | crates/pyrefly_types/src/meta_shape_dsl.rs:2982-2986 \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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2959}}}],"partialFingerprints":{"codehealthFindingId/v1":"e704b0f4d57c981fa425634bb2ef1ba0fae3ffd9f935c526bb4427054b2add16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:6779-6783 | crates/pyrefly_types/src/type_level_dsl.rs:6805-6809 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6779}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d74b03fcc9c31a2bef159bf8abce24f215afdfeba886ae4548e831c406d8f0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:7275-7279 | crates/pyrefly_types/src/type_level_dsl.rs:7294-7298 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7275}}}],"partialFingerprints":{"codehealthFindingId/v1":"017d65db452087d11ef840d4429bf4a7c7901277b4305392933ba65e4a60c8d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/alt/call.rs:2370-2374 | pyrefly/lib/alt/call.rs:2395-2399 \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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":2370}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6d93d31a703c024c5a0ae4913f09e17c273bb4a7ac9142b866b734adebe92a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/alt/overload.rs:902-906 | pyrefly/lib/alt/overload.rs:915-919 \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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":902}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0d19a90faab7e6a7ca070ba01a6f743b0c296c39e8ebe70fb03d1f5c9f3f21b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/binding/class.rs:700-704 | pyrefly/lib/binding/class.rs:1159-1166 \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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":700}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac024c5eb28824a7c4e1f632dbb3af1e531f80d00796093cc4197746392cb195"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/extract_field.rs:178-182 | pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs:303-307 \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":"pyrefly/lib/state/lsp/quick_fixes/extract_field.rs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d88dcbb2ba3895ecf67c393c8423e165d6963b2f07ce6ac809d07301b21fcd7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/stubgen/extract.rs:216-220 | pyrefly/lib/stubgen/extract.rs:230-234 \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":"pyrefly/lib/stubgen/extract.rs"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"a07dd71d51af41a430781f49bd8a33de305c41d9b80f398eebc8529e70575bf0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/pyrefly_build/src/query.rs:43-50 | crates/pyrefly_build/src/source_db/buck_check.rs:50-57 \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":"crates/pyrefly_build/src/query.rs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd08ff834248c263bb1369ec3b39c793b2368b73f9d72d9c3563ebe36a3d84fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/alt/int_list_literal.rs:41-45 | pyrefly/lib/alt/regular_nested_list.rs:56-60 \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":"pyrefly/lib/alt/int_list_literal.rs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"d775a923b8f9ac5d9d7ca894c3254f9f7ee5b3bf97d356353281bc09af43cec5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/module/third_party.rs:82-88 | pyrefly/lib/module/typeshed_third_party.rs:88-94 \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":"pyrefly/lib/module/third_party.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"8594690b4b95a35427a47da1acb2a5ed3a3edeeaff9bc0eed7dee315b983c686"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/change_signature.rs:218-228 | pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs:217-227 \u2014 before extracting anything, compare \u0060pyrefly/lib/state/lsp/quick_fixes/change_signature.rs\u0060 and \u0060pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 58 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":"pyrefly/lib/state/lsp/quick_fixes/change_signature.rs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"19b3693a0097b07b84a63f10d1e9975345a3eaee989da721f822a866016a34fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): pyrefly/lib/lsp/non_wasm/convert_module_package.rs:24-31 | pyrefly/lib/lsp/non_wasm/move_symbol_new_file.rs:41-48 | pyrefly/lib/lsp/non_wasm/safe_delete_file.rs:26-33 \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":"pyrefly/lib/lsp/non_wasm/convert_module_package.rs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b1dfcfdd9f1c6e61f8ce223b93e143f68cb730ee6dae57db1bd4da79b2c6d5c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_types/src/meta_shape_dsl.rs:3558-3562 | crates/pyrefly_types/src/type_level_dsl.rs:5455-5459 \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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":3558}}}],"partialFingerprints":{"codehealthFindingId/v1":"42ee17462c8ef2746fbc544a7675904c8047efa574b877fefb8f799925d959e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/alt/polars_specials.rs:495-501 | pyrefly/lib/binding/attrs.rs:359-365 \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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":495}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eba2a7c48a9407a0c12cc0d496539fe14b480285234658ae67a95853ded2b58"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/binding/bindings.rs:482-488 | pyrefly/lib/binding/shape_type.rs:106-115 \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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a91e5b4c0e9ac2a73975997a77ef5a914b97c1778ae76a446f120f213a0e5d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/call_hierarchy.rs:64-75 | pyrefly/lib/lsp/non_wasm/type_hierarchy.rs:20-28 \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":"pyrefly/lib/lsp/non_wasm/call_hierarchy.rs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"e521b9a704b5ad19f48e0973fffa2719bc36964c01d2bf687d716daa7ff5b4dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): pyrefly/lib/module/third_party.rs:105-110 | pyrefly/lib/module/typeshed.rs:352-357 | pyrefly/lib/module/typeshed_third_party.rs:106-111 \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":"pyrefly/lib/module/third_party.rs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"e79931eaf123e6ed80928b90e14279a6d9a5720e009e7094a8f551f4e8a81e34"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): crates/pyrefly_lsp_test/src/object_model.rs:1049-1067 | crates/pyrefly_lsp_test/src/object_model.rs:1090-1108 \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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":1049}}}],"partialFingerprints":{"codehealthFindingId/v1":"412bf3243c7ac999732cec5d7643bdee3233342b9f0aa65ac89ec09c21613f4c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): pyrefly/lib/alt/special_calls.rs:98-113 | pyrefly/lib/alt/special_calls.rs:201-216 \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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"0242066341dc67f7b8184192dfd94e3e9134b36af83cc0f39665cfaa0cdc5ebf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/change_signature.rs:155-170 | pyrefly/lib/state/lsp/quick_fixes/change_signature.rs:176-191 \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":"pyrefly/lib/state/lsp/quick_fixes/change_signature.rs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"678fa2d15cc466a856a6c8352f5bd2b641fd9e52ee6dd1ce6fbb82b922a7a7e8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/change_signature.rs:134-149 | pyrefly/lib/state/lsp/quick_fixes/change_signature.rs:155-170 \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":"pyrefly/lib/state/lsp/quick_fixes/change_signature.rs"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"1334b03c26a4651af4d6ad96c522a17d538abe42fd30bc2ec2a0a6d807ec6b70"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): pyrefly/lib/alt/special_calls.rs:101-115 | pyrefly/lib/alt/special_calls.rs:204-218 | pyrefly/lib/alt/special_calls.rs:326-340 \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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"718f74d417ffba4400c2ee11ad1c4a8320b3ba76383a9de96ab120b16a9f6e34"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): crates/pyrefly_lsp_test/src/object_model.rs:2008-2022 | crates/pyrefly_lsp_test/src/object_model.rs:2031-2045 \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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":2008}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef2c98cffde331bf668a2ea0860b0246313f7a8bd92bd272875a90deb9568724"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/alt/function.rs:2822-2835 | pyrefly/lib/alt/function.rs:2864-2877 \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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2822}}}],"partialFingerprints":{"codehealthFindingId/v1":"1675a093d96092da6ad10990bf8099850966cbab05d8966599f27474ccf8b7fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3): crates/pyrefly_config/src/migration/mypy/pyproject.rs:203-215 | crates/pyrefly_config/src/migration/mypy/pyproject.rs:217-229 | crates/pyrefly_config/src/migration/mypy/pyproject.rs:241-253 \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":"crates/pyrefly_config/src/migration/mypy/pyproject.rs"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"82eca07b0bdc045b623612b3eae281b2e359a8ff85267ef981f2023e5820c60e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/alt/expr.rs:1241-1252 | pyrefly/lib/alt/expr.rs:1279-1288 \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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1241}}}],"partialFingerprints":{"codehealthFindingId/v1":"c01b12d0fb2549e93aada5dd79baa51e8af0f567d64824b2e4402bf6a6a30fa3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): pyrefly/lib/lsp/module_helpers.rs:41-49 | pyrefly/lib/lsp/module_helpers.rs:53-61 | pyrefly/lib/lsp/module_helpers.rs:65-76 \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":"pyrefly/lib/lsp/module_helpers.rs"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"a84be5d34ee46d46b2b624b5729929bdacb7ddb754bee518a05998025d88b917"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): pyrefly/lib/commands/init.rs:310-321 | pyrefly/lib/commands/init.rs:355-366 \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":"pyrefly/lib/commands/init.rs"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"352f77472385417217bf4b389df33e9a8ad7d592572a96f9cb290978840eb5b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/pyrefly_types/src/meta_shape_dsl.rs:2403-2413 | crates/pyrefly_types/src/meta_shape_dsl.rs:2442-2448 \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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2403}}}],"partialFingerprints":{"codehealthFindingId/v1":"290b9ab74990faffebaaf5affae4f6826aefd30c793619cac690692adee1ba50"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/alt/class/attrs.rs:70-80 | pyrefly/lib/alt/class/attrs.rs:87-97 \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":"pyrefly/lib/alt/class/attrs.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"46cb4a807514852edc1bb63d2427dc21c0ea92030753137f8d039832deee25c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/error/signature_diff.rs:160-170 | pyrefly/lib/error/signature_diff.rs:181-190 \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":"pyrefly/lib/error/signature_diff.rs"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8f14199c770567ec9941183f0b62f0ef86764b418964341cde7bd20e726c887"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): pyrefly/lib/binding/bindings.rs:2114-2124 | pyrefly/lib/binding/bindings.rs:2125-2135 \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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":2114}}}],"partialFingerprints":{"codehealthFindingId/v1":"647d2e23c9befdb9ede2dad69ed8c193e3beeea831e866d7eabc48fc79662500"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:2478-2488 | crates/pyrefly_types/src/type_level_dsl.rs:4972-4982 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":2478}}}],"partialFingerprints":{"codehealthFindingId/v1":"294eab63bf4d5ee2742e47bbfbb44d1d042ebeeed6c30a323b22e8c0b3c27e86"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/binding/stmt.rs:2036-2045 | pyrefly/lib/binding/stmt.rs:2050-2059 \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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":2036}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5a6d03967dd912e3ce6a44f95105f2c2d2dbd784578e7d35d14ab9ad3be3c32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/tsp/type_conversion.rs:945-954 | pyrefly/lib/tsp/type_conversion.rs:960-969 \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":"pyrefly/lib/tsp/type_conversion.rs"},"region":{"startLine":945}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f32abc3f7a3b52e0143c48358b4013f2facbb3e50253fbb29427e8adbc670e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): pyrefly/lib/binding/narrow.rs:485-494 | pyrefly/lib/binding/narrow.rs:496-505 \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":"pyrefly/lib/binding/narrow.rs"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3ab850fd986afd480dde96c88958c322fd68ebbe9c4eab6e275869f2a0acfe3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): crates/pyrefly_lsp_test/src/object_model.rs:973-982 | crates/pyrefly_lsp_test/src/object_model.rs:1003-1012 | crates/pyrefly_lsp_test/src/object_model.rs:1035-1044 | crates/pyrefly_lsp_test/src/object_model.rs:1076-1085 \u2014 all 4 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":"crates/pyrefly_lsp_test/src/object_model.rs"},"region":{"startLine":973}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3f5d6ca551b51072e5a205a7276ef83f8687688bb759af8914f7911b4d80c18"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:3464-3472 | crates/pyrefly_types/src/type_level_dsl.rs:3514-3522 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3464}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecc649329df52438ba8c04b103db5bbd200f036bf789ea473d5843fb6c6c77d5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): pyrefly/lib/report/pysa/call_graph.rs:3246-3254 | pyrefly/lib/report/pysa/call_graph.rs:3259-3267 | pyrefly/lib/report/pysa/call_graph.rs:3272-3280 | pyrefly/lib/report/pysa/call_graph.rs:3285-3293 \u2014 all 4 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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":3246}}}],"partialFingerprints":{"codehealthFindingId/v1":"1098e47e23421a47d1ea2f8eb36b863d35ab8791aa83c1f89721da6a79be3e33"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/pyrefly_config/src/migration/mypy/pyproject.rs:193-201 | crates/pyrefly_config/src/migration/mypy/pyproject.rs:231-239 \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":"crates/pyrefly_config/src/migration/mypy/pyproject.rs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ca5521f90479694b2d3bd2651ae1945ce202e0e53e939574dc88c04aa1ef8a6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/convert_module_package.rs:116-123 | pyrefly/lib/lsp/non_wasm/convert_module_package.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":"pyrefly/lib/lsp/non_wasm/convert_module_package.rs"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb86ae3e08af8bc700de8df15b70dbd0996e6afa959d1115ec99ff5ee5161a83"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): pyrefly/lib/lsp/non_wasm/server.rs:6015-6023 | pyrefly/lib/lsp/non_wasm/server.rs:6040-6048 | pyrefly/lib/lsp/non_wasm/server.rs:6068-6076 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":6015}}}],"partialFingerprints":{"codehealthFindingId/v1":"30e0dda8656a06d4dd12d29ca1aa338d4bec40fd03615ba21e5771f3cb03c32f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/server.rs:4115-4122 | pyrefly/lib/lsp/non_wasm/server.rs:4190-4197 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":4115}}}],"partialFingerprints":{"codehealthFindingId/v1":"355681aa6d52661720c559cb614b9798aa6a2d3f714b3974afb288b4a0c302cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): pyrefly/lib/alt/regex.rs:82-89 | pyrefly/lib/alt/regex.rs:95-102 \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":"pyrefly/lib/alt/regex.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebcd81838e0424dfa90adddfa6c723f86a25590470711cc44c8ec941f79b8675"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:3449-3455 | crates/pyrefly_types/src/type_level_dsl.rs:3499-3505 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":3449}}}],"partialFingerprints":{"codehealthFindingId/v1":"f198366efd862263b6324e0bc0ec1e6de21ae1fbe90cd6ce86b4b11805967538"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/alt/class/variance_inference.rs:854-860 | pyrefly/lib/alt/class/variance_inference.rs:866-872 \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":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":854}}}],"partialFingerprints":{"codehealthFindingId/v1":"667d057610d19c5105372cb8321f983981608cad3de5ce7697f23cc914dfa237"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/pyrefly_config/src/args.rs:493-499 | crates/pyrefly_config/src/args.rs:500-506 \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":"crates/pyrefly_config/src/args.rs"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8962aa3e0e69505084b513c24d56ad4899fcab1229f5117dad8091d3dfe811"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/binding/binding.rs:1459-1465 | pyrefly/lib/binding/binding.rs:2771-2777 \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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":1459}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8c5ad7d84235410cc857c2c7d4c98d2e84cb614cf72c3d9288fd298a44ca65c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/inline_parameter.rs:91-97 | pyrefly/lib/state/lsp/quick_fixes/inline_variable.rs:96-102 \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":"pyrefly/lib/state/lsp/quick_fixes/inline_parameter.rs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"916c0f19a6c9844344e91effca407e7ed7abfaee18459dc3e7cc5656c2f553eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:6928-6933 | crates/pyrefly_types/src/type_level_dsl.rs:7057-7062 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6928}}}],"partialFingerprints":{"codehealthFindingId/v1":"08a07870a6900f6e56c9117f2ebd6b76aace7a5346f632938ab13ecbd0b75508"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:7268-7272 | crates/pyrefly_types/src/type_level_dsl.rs:7289-7293 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7268}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f5e54f6d09bdcb9abdace8ee7199d1e0fb68b781cf6ff3ac75d46f8c1546cbc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): pyrefly/lib/lsp/non_wasm/server.rs:6010-6014 | pyrefly/lib/lsp/non_wasm/server.rs:6035-6039 | pyrefly/lib/lsp/non_wasm/server.rs:6063-6067 \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":6010}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d037fe2141e477d95f6581c26c4a6c445f12f58ee304cd3fa63d7cea807a08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs:715-719 | pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs:727-731 \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":"pyrefly/lib/state/lsp/quick_fixes/introduce_parameter.rs"},"region":{"startLine":715}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac283de96be79b13f2a88efd10603628781ec48b169061fb18c8b291e2a6fb05"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_types/src/type_level_dsl.rs:7483-7487 | crates/pyrefly_types/src/type_level_dsl.rs:7514-7518 \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7483}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecff6873621dc850eb23859fc39e6962b0117166e8ad954ce7e74ca8509e408a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/pyrefly_types/src/einops.rs:467-471 | crates/pyrefly_types/src/einops.rs:486-490 \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":"crates/pyrefly_types/src/einops.rs"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"f55f853aead7e46b4c42602367495c9aa8e769b9be043485354106a9b9d0f972"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/pyrefly_types/src/shape_index.rs:650-655 | crates/pyrefly_types/src/shape_index.rs:663-668 \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":"crates/pyrefly_types/src/shape_index.rs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dfccc4ae6066667ec619959155bfc76a6d3aa982d4c4e63f6e7b0147566574f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): pyrefly/lib/alt/narrow.rs:2044-2051 | pyrefly/lib/alt/narrow.rs:2072-2079 | pyrefly/lib/alt/narrow.rs:2104-2111 \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":2044}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4c291dd0effdbf6484856de3bbb39d97acfc4530605cd0af31c608f4fd97069"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/alt/solve.rs:6694-6698 | pyrefly/lib/alt/solve.rs:6819-6823 \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6694}}}],"partialFingerprints":{"codehealthFindingId/v1":"df7d5a42a098eaebddc8992b2ece6ae3e9a5645426a7774e5f01ef44ed53dc5c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/lsp/non_wasm/code_lens.rs:46-50 | pyrefly/lib/lsp/non_wasm/code_lens.rs:54-58 \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":"pyrefly/lib/lsp/non_wasm/code_lens.rs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d32e9d312a35219cc8aa4f84a169f4d81de58ef4f8d559de31243fd805bcbc1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): pyrefly/lib/solver/subset.rs:1167-1171 | pyrefly/lib/solver/subset.rs:1180-1184 \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1167}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81bee7eaa16efeb5886274714088eea80b38b1ea2917bd6ea862abcd2e2f6fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (45\u201346 lines \u00D7 4): tensor-shapes/pyrefly-einops-stubs/run_pyrefly.py:30-74 | tensor-shapes/pyrefly-jax-stubs/run_pyrefly.py:30-75 | tensor-shapes/pyrefly-numpy-stubs/run_pyrefly.py:29-74 | tensor-shapes/pyrefly-torch-stubs/run_pyrefly.py:29-74 \u2014 \u0060tensor-shapes/pyrefly-einops-stubs/run_pyrefly.py\u0060 and \u0060tensor-shapes/pyrefly-jax-stubs/run_pyrefly.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 2 separate duplicated blocks between them, totalling at least 61 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-einops-stubs/run_pyrefly.py:30\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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-einops-stubs/run_pyrefly.py"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4eaaa1b59bdbb662d72174d07a0d630f9b70513fc688f45f9ea9e2598ef0fc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27\u201328 lines \u00D7 2): tensor-shapes/pyrefly-jax-stubs/suites.py:19-46 | tensor-shapes/pyrefly-numpy-stubs/suites.py:19-45 \u2014 \u0060tensor-shapes/pyrefly-jax-stubs/suites.py\u0060 and \u0060tensor-shapes/pyrefly-numpy-stubs/suites.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 28 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-jax-stubs/suites.py"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5a0be12331a1e940762bfc471a3118578ab3143a7e10460426c1f1a5734bf20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): crates/tsp_types/protocol_generator/generate_protocol.py:613-632 | crates/tsp_types/protocol_generator/generate_protocol.py:768-787 \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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":613}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b3dd26d263475102850600627f6b00082f154eac2e225d969d0b2e1a387ded1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): crates/tsp_types/protocol_generator/generate_protocol.py:116-132 | crates/tsp_types/protocol_generator/generate_protocol.py:142-158 \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":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"88310a5287895aa40996f028cbfe0ffc5fa45a98dd1cf1cab20225fbaa9cc862"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): scripts/github_utils.py:765-781 | scripts/github_utils.py:909-925 \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 \u0060scripts/github_utils.py:765\u0060 it begins part-way through the construct above it, 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/github_utils.py"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd016bf0c9682bc403fbff73f8aae8519bee5efffc85245711d3bd568d1c6f99"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201316 lines \u00D7 3): crates/tsp_types/protocol_generator/generate_protocol.py:571-584 | crates/tsp_types/protocol_generator/generate_protocol.py:585-598 | crates/tsp_types/protocol_generator/generate_protocol.py:737-752 \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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b0ae429128ee83885f18b0966823e2b3412e889d0702e766ab6f59b08e41868"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 5): tensor-shapes/microtorch/run_pyrefly.py:35-48 | tensor-shapes/pyrefly-einops-stubs/run_pyrefly.py:64-77 | tensor-shapes/pyrefly-jax-stubs/run_pyrefly.py:64-78 | tensor-shapes/pyrefly-numpy-stubs/run_pyrefly.py:63-77 | tensor-shapes/pyrefly-torch-stubs/run_pyrefly.py:63-77 \u2014 \u0060tensor-shapes/microtorch/run_pyrefly.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/run_pyrefly.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 15 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/microtorch/run_pyrefly.py:35\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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060tensor-shapes/pyrefly-torch-stubs/run_pyrefly.py:78\u0060 calls \u0060venv_site_packages\u0060, \u0060venv_python\u0060 and \u0060tensor-shapes/microtorch/run_pyrefly.py:49\u0060 does not \u2014 after which the two agree again for 4 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":"tensor-shapes/microtorch/run_pyrefly.py"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa63dc471469ec12e759f5143834dfbb7a420e109ab7f64ef940168dbcc44d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201315 lines \u00D7 2): scripts/github_utils.py:725-739 | scripts/github_utils.py:834-846 \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 \u0060scripts/github_utils.py:725\u0060 it begins part-way through the construct above it, 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/github_utils.py"},"region":{"startLine":725}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8d19ae3242acff5f8a0085cf1529a097c94ad2fc2f32062d06f8dad05c148e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): scripts/issue_ranker/v1_analysis.py:324-337 | scripts/issue_ranker/v1_analysis.py:345-358 | scripts/issue_ranker/v1_analysis.py:367-380 \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. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060scripts/issue_ranker/v1_analysis.py:359\u0060 calls \u0060_escape_md_table\u0060, \u0060get\u0060 and \u0060scripts/issue_ranker/v1_analysis.py:338\u0060 does not \u2014 after which the two agree again for 4 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":"scripts/issue_ranker/v1_analysis.py"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"d95f9f57c1237f932c23e909f713bae3a001c23445c5c5e197f770419275d62f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201314 lines \u00D7 3): scripts/primer_classifier/llm_client.py:313-326 | scripts/primer_classifier/llm_client.py:429-442 | scripts/primer_classifier/llm_client.py:765-776 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060scripts/primer_classifier/llm_client.py:313\u0060 it begins part-way through the construct above it, 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/primer_classifier/llm_client.py"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d1bbbaeaa461f5125d43f4444894a94959d94a701859badf4fad798369ae575"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/report/cinderx/view_types.py:49-62 | pyrefly/lib/report/cinderx/view_types.py:68-81 \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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/report/cinderx/view_types.py"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"28ed8dd69555a70b3aa00b54f1e132c84b05066a145b8d74ee37628101b2f74c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): scripts/issue_ranker/passes/primer_impact.py:247-260 | scripts/issue_ranker/passes/primer_impact.py:270-283 \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":"scripts/issue_ranker/passes/primer_impact.py"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"3726251fa008aade0453a41f1359f6b9dee84c2dbc30efb2d29ae0c2ac84ab01"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): scripts/primer_classifier/classifier.py:389-402 | scripts/primer_classifier/classifier.py:532-544 \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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/primer_classifier/classifier.py"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"81500a4ccd0ffbfd747cc6bd833a8649c5821838030d839f67a7643c92ffa7b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): conformance/conformance_output.py:234-244 | conformance/conformance_output.py:274-285 \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 \u0060conformance/conformance_output.py:234\u0060 it begins part-way through the construct above it, 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. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"conformance/conformance_output.py"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"8855e8efbd7bae3e1c935464c5b06588a3f9e3c5f472a058787f7080b66ad601"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/tsp_types/protocol_generator/generate_protocol.py:334-345 | crates/tsp_types/protocol_generator/generate_protocol.py:349-360 \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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"63501a00f77570caa929040d4ab1ee8453978dac89720e4223e982678f7433ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/tsp_types/protocol_generator/generate_protocol.py:474-485 | crates/tsp_types/protocol_generator/generate_protocol.py:523-534 \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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060crates/tsp_types/protocol_generator/generate_protocol.py:472\u0060 calls \u0060rfind\u0060 and \u0060crates/tsp_types/protocol_generator/generate_protocol.py:522\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":"crates/tsp_types/protocol_generator/generate_protocol.py"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"29476d9d28c2084ed9cd8e29bcb14c625b2a47423aa64e97c4cb4c1d5178b48c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): scripts/github_utils.py:452-462 | scripts/github_utils.py:473-483 \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 \u0060scripts/github_utils.py:452\u0060 it begins part-way through the construct above it, 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/github_utils.py"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b72678dfcbc67f9094e3c6e2f60007d04d08c01b916957baa905ac248c78df8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 3): scripts/github_utils.py:444-453 | scripts/github_utils.py:465-474 | scripts/github_utils.py:486-494 \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":"scripts/github_utils.py"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"29f17d1d514719c2628480d314e2a2b85c87ebc6e3d12bae2d774489a727de8b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): scripts/llm_transport.py:122-129 | scripts/llm_transport.py:178-185 \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 \u0060scripts/llm_transport.py:122\u0060 it begins part-way through the construct above it, 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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/llm_transport.py"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfd5188d885e9fdc9024b9a6161994a458f0c8c8884097a5dbefa415262903a7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): scripts/primer_classifier/code_fetcher.py:199-206 | scripts/primer_classifier/code_fetcher.py:246-253 \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":"scripts/primer_classifier/code_fetcher.py"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd9fc3646e41cfa6186c01630f050cdea960e959af3dd57ef5377ab4e2f3a2ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): scripts/llm_transport.py:119-125 | scripts/llm_transport.py:187-193 \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":"scripts/llm_transport.py"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"e661c6949938c6f5a1614acedd73c42c08c69a8a0ab38d7b46b356b74df36cc5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): scripts/issue_ranker/report_formatter.py:24-35 | scripts/issue_ranker/report_formatter.py:187-192 \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. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060scripts/issue_ranker/report_formatter.py:22\u0060 calls \u0060get\u0060 and \u0060scripts/issue_ranker/report_formatter.py:185\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":"scripts/issue_ranker/report_formatter.py"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd61e8e74f204901d740605a8277ec1fddb04f0459c49abfb6e79468756eb05"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (5 members, 26 shared lines): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:467-497 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:469-499 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:409-439 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:448-478 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:384-414 \u2014 These 5 members are variants of one another: a block of 26 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them 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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff668811bc3486cf8f4d24207217c5b07e7325a502925d59f3ad8d33069efca1"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (5 members, 23 shared lines): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:276-315 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:278-317 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:235-269 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:256-295 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:209-243 \u2014 These 5 members are variants of one another: a block of 23 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them 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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"e908e25988c1bdc2ae4d5cc3e7be279460b06515183ac0e05c53fa349c75f6df"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 69 shared lines): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:106-180 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:108-182 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:105-179 \u2014 These 3 members are variants of one another: a block of 69 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 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 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4b104d8afd95e47fb5e3234a7714701889f6d689575cdf55a127cf846bc07ff"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 29 shared lines): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:411-452 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:416-457 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:428-469 \u2014 These 3 members are variants of one another: a block of 29 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 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 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"e182e7162de72fcfd53c632153e982b840d30b101090f2312e337dd1370a59ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 10 shared lines): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:257-272 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:262-277 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:280-295 \u2014 These 3 members are variants of one another: a block of 10 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 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 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"12821f73cb112708a71f94fef3d0b9a20ea97db55665be738eeaa9e962aa8b07"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (80 shared lines): tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:56-270 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:323-444 \u2014 These two members are variants of one another: 80 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":"tensor-shapes/pyrefly-torch-stubs/examples/openpose.py"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"af499e61b5187358e8cdfe8d315f3a4f622b75979b89d06d78ba5ee99c5576b9"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:94-100 | tensor-shapes/pyrefly-torch-stubs/examples/mixtral_moe.py:184-190 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:99-105 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:103-109 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:117-123 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:107-113 \u2014 These 6 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 6 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 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"45c0c37ca9d5df8e07884b97a99dcfb2d15f1f580565eab21342dd9f8977853e"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:104-121 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:109-126 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:113-130 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:127-144 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:117-134 \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":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbb1f91a539fbae2b06dc98499d0510a996cf4a08ad83ce3e3c71b9cccf6552b"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:494-524 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:499-529 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:465-495 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:506-536 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:458-488 \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":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3fc372d77832c33b6d622d1fae79a135f349f42bd21f2919d60c87071669d3b"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:227-247 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:232-252 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:236-256 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:250-270 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:240-260 \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":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6776a11567efbd57b4801cd16297d93053e8372621d216c03a7639dfe904d57"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:278-295 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:283-300 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:282-296 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:301-318 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:286-300 \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":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"02e35b1b9c94052832457ddb5d6434425581241112be9cfd05b001ab0b62e204"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:75-101 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:77-103 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:77-100 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:76-102 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:72-95 \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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"87703da15f2888ce7f84e67fcb2dce4ebd33c888989816483cc0c5a0fb60d67c"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:334-339 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:336-341 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:288-293 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:315-320 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:263-268 \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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d66e949766f7e80c3407d31332effce9bc891b1a545c048bbf9be2ad85fc525"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:395-402 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:397-404 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:337-344 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:376-383 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:312-319 \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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfb283f537f5065ba8ba98d9a7de76d58a75c3fa445a2f4d7213246edefb9c0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:406-463 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:408-465 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:348-405 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:387-444 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:323-380 \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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e5c24669dbe22784ec804e52380ddce032e0e46e115d21958dded929dbaad4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:500-513 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:502-515 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:442-455 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:481-494 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:417-430 \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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7d0853babb7d05b918efc92c15325c8bf41e53f7dbf8ab469e75bee58c8b15d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/pytest_fixture.rs:372-385 | pyrefly/lib/state/lsp/quick_fixes/pytest_fixture.rs:470-483 \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":"pyrefly/lib/state/lsp/quick_fixes/pytest_fixture.rs"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6c1a5037890c8a16da4db0d2b99e6109b10a9a064a6f43acbe4f240de61518f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): pyrefly/lib/state/lsp/quick_fixes/pytest_fixture.rs:437-449 | pyrefly/lib/state/lsp/quick_fixes/pytest_fixture.rs:498-510 \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":"pyrefly/lib/state/lsp/quick_fixes/pytest_fixture.rs"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5a837efa5d173ae882388e92024cc9b1a6c7d4bc6dce083430b68124af89dc7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (58 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:406-463 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:408-465 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:348-405 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:387-444 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:323-380 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9fcd6a2b52297c1799eb5920840dd6e7d17b079e786eb9c4c72e6e1e47d95da"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (45 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:105-149 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:98-142 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 16 separate duplicated blocks between them, totalling at least 282 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdcfeb2898d7347dbdb3eb8cbabe03fdf64c3cf98dad481544a9d6442b6b5ab1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (44 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:346-389 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:348-391 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:327-370 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4a3fbec6fb94fb7ad162c3759321125bddbfeb98016bdc29847379ef087e227"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:106-137 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:108-139 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:105-136 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:106\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"790d3973b2cbbc4e9dcbaf9a28d363c397b7b4ad0fbfcb06f2a7cf9be20dc23b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:300-331 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:275-306 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 16 separate duplicated blocks between them, totalling at least 282 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b62be49b220ded47c508378b6b3d612f14489c981d77b58e6b49d362dfbd967"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:494-524 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:499-529 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:465-495 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:506-536 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:458-488 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"218163db7d64607318d1aceee7ee3a7cc5093407ea65f1858cd5e89c3251f26d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:472-497 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:474-499 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:414-439 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:453-478 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:389-414 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"d392d4e1a66b52df863f6dcb2a23642a9a9b2f29ab14230c7e17a54807e36c53"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:523-544 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:525-546 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:504-525 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f592d0977e23b8dda521b7087149fae99130da3e79d85ec2fbb4c428b231d08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:227-247 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:232-252 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:236-256 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:250-270 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:240-260 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdd9c9d29ac37ddafd25f23bcb6f57ff86b3fc053c09c828433fb317a5ce6eb1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:410-430 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:408-428 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bbdf265d83be95c0b15ab555c7477ae87aa7fa138ec8a5bddcc2f2cffb4af5c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:139-158 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:141-160 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:138-157 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:139\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb891439c7c3f47e92602fc5fda84d048c880a910f56b03bda94a116f9af4092"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:465-483 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:440-458 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 16 separate duplicated blocks between them, totalling at least 282 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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc9d30803e032f7fed1134acced014e51b94e25d4c6963a2dd9f5ae6f6d75405"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:104-121 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:109-126 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:113-130 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:127-144 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:117-134 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"2108aba64ee3dba77511f555c7d41f40e32750c584a4d0d4b638184016e9d172"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:84-100 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:86-102 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:84-100 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:85-101 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:79-95 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:101\u0060 calls \u0060assert_type\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:102\u0060 does not \u2014 after which the two agree again for 4 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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dd3278d3277a69bfae8d5a04f6b219d17c261ac7bf45e6600db05d1f538880e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:164-180 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:166-182 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:163-179 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:164\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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6587c17c9f2af6b91e543ad6eec184b9a11daf328db48902c8b5f003cc1967b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:287-303 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:289-305 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:267-283 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:287\u0060 it begins part-way through the construct above it, 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ec3521e15d8192da5df6113b49fcac4913c3a1027cd5585285d91eff3df94ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:276-290 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:278-292 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:235-249 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:256-270 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:209-223 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"796a3dbfa576f0ba1d2ec468eaca74bb04c75f611a2d000c8991040257f39cdd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:281-295 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:286-300 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:304-318 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:281\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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"b693748626fca674aea242b93089574198a85e7b5c5f00e8d50d2b1053e4d424"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:448-462 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:441-455 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:448\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d8bd9d49e33a40faa1eb9b109afb09453e12369f4cdc8ebe45c9ed654de432"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/unet.py:215-229 | tensor-shapes/pyrefly-torch-stubs/examples/unet.py:275-289 \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":"tensor-shapes/pyrefly-torch-stubs/examples/unet.py"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"688ba1fb9395c81b2ca35388edea092ea57c60c8790e22f901df80eeecd142d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:500-513 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:502-515 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:442-455 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:481-494 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:417-430 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"c210e251c56b98965091611ef45242a2e23b7000b32022818871903b5a236463"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:470-483 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:475-488 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:482-495 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"40b5ea177ce0a0d6506d87938a440c0af18c96d88449d5bf80c9b9e88b594e8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:545-558 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:547-560 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:526-539 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"c04ba40156c73b14eeec33a4c90246c8e0951b89fded061b5b53a36ab4bb55f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/llama.py:501-514 | tensor-shapes/pyrefly-torch-stubs/examples/llama.py:518-531 \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":"tensor-shapes/pyrefly-torch-stubs/examples/llama.py"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"15bfdceafc76469b944d45d7a795bc014e19a5a5df9403e3da2e7fd0b82cfc78"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:283-296 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:287-300 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ceba841111aaa4140275d06249966067f470e54751228d506ca7a5b709a67f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201313 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/drq.py:400-407 | tensor-shapes/pyrefly-torch-stubs/examples/drq.py:409-421 \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":"tensor-shapes/pyrefly-torch-stubs/examples/drq.py"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a7835a17101655870dd4e4c23b8bb002b28caa5246b665d5b314badfb6eb2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:301-312 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:303-314 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:255-266 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"32e09e89e136c448cee94fdf73510a3f69b3fca8fe7fa782d03d7ce6e53b369b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:82-93 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:355-366 \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 \u0060tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:82\u0060 it begins part-way through the construct above it, 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, \u0060tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:370\u0060 calls \u0060Sequential\u0060, \u0060Conv2d\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:94\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":"tensor-shapes/pyrefly-torch-stubs/examples/openpose.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"495967a3cd2551ee52a0ff02b2bb2dabb57112f7e800e4cea1aec5f0a6233978"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:500-511 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:493-504 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"6db5596f61bbc79ba4bb2bd200267631e65df69f710498f7f6080254ad50ad00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:281-292 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:229-240 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 10 separate duplicated blocks between them, totalling at least 173 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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f37202e4e9002aa2be129f58f71786ba8540ba44931f07efdbde807381e0d98"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:377-387 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:382-392 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:393-403 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:377\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6f168608fa5e8f8e080edae4372343b9c71d861ba6055a49ad2dfe4e3fc780c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:534-544 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:539-549 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:546-556 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:534\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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":534}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d4cf87821b74b59d8837166ce0b92859ae8785b75a131fc1bd70a7a78cee98b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:266-276 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:270-280 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:266\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. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"556aa8f5ee60257d46794c6879b9db9f274a59ee579dc96802327699fec4c180"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:257-266 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:262-271 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:280-289 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:257\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"198f35967a939a4c918f4cf0185215d5d853ec8c0a2c37405bdb686aaee8a799"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:427-436 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:432-441 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:444-453 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:427\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"a431f8d5759a4d4ce5271e2328c42e7a4f55e289f47a316272fb7cdfa110f5bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:484-493 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:459-468 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 16 separate duplicated blocks between them, totalling at least 282 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed7350ebec7885fa467c73ad93c312c761eea4cfaefbd5afa65fdf95136ae5a9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/unet.py:196-204 | tensor-shapes/pyrefly-torch-stubs/examples/unet.py:256-264 \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":"tensor-shapes/pyrefly-torch-stubs/examples/unet.py"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"082043777f3170598079e16a24138fe791768effb74af8785474981082a4bc2c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:308-315 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:310-317 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:262-269 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:288-295 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:236-243 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec782eaaf015a0ac6f445f12a07587bcf98ebd2385e10b00d7427f1b441fafb1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:395-402 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:397-404 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:337-344 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:376-383 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:312-319 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5071c038edd4bfd8f397a45cfe8890e8d2784759a3ebac228b6dbaeb5109bb3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:438-445 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:443-450 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:455-462 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:438\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"2babc13e5d0db5d23dd619f24571959ed0d8b0a5b5810a580440279eb5be5a00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:565-572 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:570-577 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:572-579 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"33e25c755792474482a221ee254cfe1f0bf07bc88b366c45d0402fe95e2ce281"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:213-220 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:215-222 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:210-217 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3ec9adde4d52bdf32d3c3ce5096942a6ba2f167c260152f1df93dbee196cd1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/demucs.py:498-509 | tensor-shapes/pyrefly-torch-stubs/examples/demucs.py:514-521 \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":"tensor-shapes/pyrefly-torch-stubs/examples/demucs.py"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ea2a0e0615c9cf562ca5a7b347d3ec15178eeb8ca9ca01d0282b202d0781d25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 6): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:94-100 | tensor-shapes/pyrefly-torch-stubs/examples/mixtral_moe.py:184-190 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:99-105 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:103-109 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:117-123 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:107-113 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"011596e07386b75f147f00ed2c9037ddb8ed8a906cb23f5853886780202d7b6c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:283-289 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:288-294 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:285-291 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:306-312 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:289-295 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:290\u0060 calls \u0060assert_type\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:293\u0060 does not \u2014 after which the two agree again for 4 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":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"92a59fe9d7de6a1f73b89f34ea6833e3fea57b6477f8251a583ccc53eaf0f1af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:388-394 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:393-399 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:404-410 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:388\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"95536257243268349a349702b84a966391615342f32b28206cc9ef711d214d1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:200-206 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:202-208 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:197-203 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"185467feab33028676ab7f2800f20d125149dd90ecfef3f5f905555f47b80fde"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (4\u20137 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:484-487 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:490-496 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:497-503 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:484\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. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:490\u0060 calls \u0060assert_type\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:484\u0060 does not \u2014 after which the two agree again for 5 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":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a8c36bbc19b18d8ad695dd997541fea9d5d6de00163090843aff069a861e13a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:380-386 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:377-383 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:380\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"425d12b0b210669ba5ba107f93067a63016348fce8b279f146d9cb830d4521b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:403-409 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:401-407 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"c32bd64223de148769dcd112a4578b6703af5b45c363c0fc341e56429f83bf8e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:411-416 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:416-421 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:428-433 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:411\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7bb43736fc5b4f03697e4648c466f7bc1fffe8cf94c2ca97ddc80405cdc2b15"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:82-87 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:265-270 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:355-360 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:82\u0060 it begins part-way through the construct above it, 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/openpose.py"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cf842c037ba02b4f88472397cc09d757cb0fddf4ffe679f3fc441afeefea936"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:374-379 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:371-376 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0794d9d996cd78c5822598733ab1061d18704444982c201bd36bd6c554a720a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/unet.py:232-237 | tensor-shapes/pyrefly-torch-stubs/examples/unet.py:292-297 \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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/unet.py"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2435b52dadbdc06722dc873778840176ec823d2e34b9f84a2da2c4316d46f39"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (4\u20135 lines \u00D7 25): tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:60-63 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:64-67 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:71-75 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:80-84 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:92-96 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:105-109 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:118-122 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:133-137 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:148-152 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:163-167 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:178-182 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:195-199 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:210-214 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:225-229 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:240-244 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:257-261 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:327-330 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:331-334 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:338-342 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:347-351 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:372-376 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:387-391 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:402-406 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:417-421 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:432-436 \u2014 all 25 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. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:64\u0060 calls \u0060MaxPool2d\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:85\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":"tensor-shapes/pyrefly-torch-stubs/examples/openpose.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"a921b5340a06edb39de5c15fecfdfa0baf312fc9b701fbd911bd7c68a6286f30"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 16): tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:96-100 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:109-113 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:126-130 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:141-145 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:156-160 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:171-175 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:186-190 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:203-207 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:218-222 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:233-237 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:248-252 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:380-384 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:395-399 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:410-414 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:425-429 | tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:440-444 \u2014 all 16 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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060tensor-shapes/pyrefly-torch-stubs/examples/openpose.py:96\u0060 it begins part-way through the construct above it, 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/openpose.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcc63fd7b27f0bd9772b6da398483acd99b8c6370e0efa0c3480558369701af1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:334-338 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:336-340 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:288-292 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:315-319 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:263-267 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"73162bebd8f5e9131da0d301ba39806afba0a1fa7c66180760ad3f92d173346f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:448-452 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:453-457 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:465-469 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e626743d8921fb14f0e0534ba18e5b130797adf6a63ace3554744d66302ece"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:75-79 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:77-81 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:76-80 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"16aacc005e6b4e4f39244b84d5fba3b6225b18403f74bd60b9e041f048335321"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-numpy-stubs/examples/physical_science.py:89-93 | tensor-shapes/pyrefly-numpy-stubs/examples/physical_science.py:146-150 \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":"tensor-shapes/pyrefly-numpy-stubs/examples/physical_science.py"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"833b4a955ab018fc90f8dee5edd7117c497b27ed357a9bbba6c98d142cb9f14b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py:224-228 | tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py:287-291 \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":"tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e30ab86c93eabfd721b2b0502e72620e4c825be5c8950c83923ba903699a8b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py:403-407 | tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py:441-445 \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. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py:439\u0060 calls \u0060assert_type\u0060, \u0060relu\u0060, \u0060conv4\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py:402\u0060 does not \u2014 after which the two agree again for 3 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":"tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a0d934b2ffd236b254dfac3b83d424632fb998843572996c904c6641be478ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/tacotron2.py:301-305 | tensor-shapes/pyrefly-torch-stubs/examples/tacotron2.py:307-311 \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":"tensor-shapes/pyrefly-torch-stubs/examples/tacotron2.py"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"73a312ab1dc3f0175afdc6953aaab1a638b8ed5834c2917693da20db2e878c2f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:330-338 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:335-343 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:331-339 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:348-356 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:330-338 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f7f678cbbfb2f158a02880a00122d1bf4f1f7c64239d32a47c1598c7e6de21d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 6): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:398-402 | tensor-shapes/pyrefly-torch-stubs/examples/mixtral_moe.py:269-273 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:403-407 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:390-394 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:415-419 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:388-392 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"18cf5d547a283ae5c9739cb0d11533d566ae0016b5e116be22414977586b3c84"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:322-331 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:324-333 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:276-285 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:302-311 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:250-259 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"db2c779ab06fcddda5c84699d03e6ba8c920f5a59db69e901ff10ceb8e6b532b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:532-536 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:520-524 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1cf1b7191907ae6c61d94652e463869c81a009a07abdac60ad0c017059c182f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:165-169 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:156-160 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 16 separate duplicated blocks between them, totalling at least 282 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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"81dfffd67ff083a8c5e67e92cbc9fe00095bc6ef3076ca0a6396c843ffa8d5f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:176-180 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:167-171 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 16 separate duplicated blocks between them, totalling at least 282 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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"576f7aaf14100ef64f49a8dd40f5e04e0f464db35995671690560b028bc9e72a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/super_slomo.py:380-384 | tensor-shapes/pyrefly-torch-stubs/examples/super_slomo.py:388-392 | tensor-shapes/pyrefly-torch-stubs/examples/unet.py:356-360 \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":"tensor-shapes/pyrefly-torch-stubs/examples/super_slomo.py"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"d284b674084c77cbe7c51b25a491d7063605e1c9bd0e3b53e7458a7ddd501063"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/background_matting.py:509-513 | tensor-shapes/pyrefly-torch-stubs/examples/stargan.py:205-209 \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":"tensor-shapes/pyrefly-torch-stubs/examples/background_matting.py"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e8d7e6a649f48fb3f226ba1afd14ec6e1d79f35a80a8a7c0e95b196e1cd94b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 7): tensor-shapes/pyrefly-torch-stubs/examples/demucs.py:397-404 | tensor-shapes/pyrefly-torch-stubs/examples/demucs.py:408-415 | tensor-shapes/pyrefly-torch-stubs/examples/demucs.py:419-426 | tensor-shapes/pyrefly-torch-stubs/examples/demucs.py:430-437 | tensor-shapes/pyrefly-torch-stubs/examples/demucs.py:441-448 | tensor-shapes/pyrefly-torch-stubs/examples/demucs.py:452-459 | tensor-shapes/pyrefly-torch-stubs/examples/sam.py:1309-1313 \u2014 there are 7 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 7 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/demucs.py"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1664d6816a69f0f137eaa108f386663d69fe1d47dc88c5bc885c7bd84f49a94"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): tensor-shapes/pyrefly-torch-stubs/examples/drq.py:524-528 | tensor-shapes/pyrefly-torch-stubs/examples/drq.py:532-536 | tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py:525-529 | tensor-shapes/pyrefly-torch-stubs/examples/soft_actor_critic.py:533-537 \u2014 there are 4 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 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/drq.py"},"region":{"startLine":524}}}],"partialFingerprints":{"codehealthFindingId/v1":"50a665a3affdcae88e82a8a3974560b94cf70d1d72ea8532cfb8f908a1400d52"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): tensor-shapes/pyrefly-jax-stubs/examples/bert.py:479-486 | tensor-shapes/pyrefly-jax-stubs/examples/bert.py:492-499 \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":"tensor-shapes/pyrefly-jax-stubs/examples/bert.py"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"e21bcacd3c8ca3964d9ef6152d6983146cc6531f702b07ac0b50abee67e1eac1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/densenet.py:287-291 | tensor-shapes/pyrefly-torch-stubs/examples/densenet.py:295-299 \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":"tensor-shapes/pyrefly-torch-stubs/examples/densenet.py"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"300873a1bbb54a984b510c845e9cafa136b8758b6082a69b78a2c198fb469b47"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/densenet.py:311-315 | tensor-shapes/pyrefly-torch-stubs/examples/densenet.py:319-323 \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":"tensor-shapes/pyrefly-torch-stubs/examples/densenet.py"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd7c44a4c877984971cf98a989f5ed651c7ff9554671f07eda0d2096ac93b74"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/drq.py:548-554 | tensor-shapes/pyrefly-torch-stubs/examples/drq.py:558-564 \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":"tensor-shapes/pyrefly-torch-stubs/examples/drq.py"},"region":{"startLine":548}}}],"partialFingerprints":{"codehealthFindingId/v1":"31b5055dda312fcd9d0aee5d12a00486d11f47702421cb24b29c8507949a826f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py:345-352 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py:350-357 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var.py:363-370 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 20 separate duplicated blocks between them, totalling at least 218 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/gptfast.py"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"36a8b525f248c1e7ca49932e078e3abfa2e0d422418c82247dd7d4efc55ae9a9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:36-40 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:38-42 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:49-53 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"d37931256fc6a68358c717faa37aecbe98e0586e12b4465a5d4bd13ad0b8e087"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py:187-193 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py:189-195 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py:186-192 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py\u0060 as WHOLE FILES: this scan already matched 22 separate duplicated blocks between them, totalling at least 371 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"23e14b72b5313d11c2cd0dd9da3039e9b6f6ca85a1aa7178ea956861a85f4e66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py:346-350 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py:345-349 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 17 separate duplicated blocks between them, totalling at least 201 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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/gptfast_future_annotations_runnable.py"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"f475df1f859756edb185fab791a97b5f8b528576e7821ab609a990f5f6dd03ba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py:156-160 | tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py:149-153 \u2014 before extracting anything, compare \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py\u0060 and \u0060tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py\u0060 as WHOLE FILES: this scan already matched 16 separate duplicated blocks between them, totalling at least 282 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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"f147ecc811d83fc7c222254702b270df6666eef193c7fb3a601b09bb6052670a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/stargan.py:213-218 | tensor-shapes/pyrefly-torch-stubs/examples/stargan.py:222-227 \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":"tensor-shapes/pyrefly-torch-stubs/examples/stargan.py"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f11a42749863f1acdfe74c64643ffe338edd374bf9831ffbb0e6ce7ccb99ef7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/stargan.py:231-236 | tensor-shapes/pyrefly-torch-stubs/examples/stargan.py:240-245 \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":"tensor-shapes/pyrefly-torch-stubs/examples/stargan.py"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c87fb13bceb7af581f39703d02b97842d662988b6eea6d27febcac10bdd51f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/super_slomo.py:346-350 | tensor-shapes/pyrefly-torch-stubs/examples/super_slomo.py:354-358 \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":"tensor-shapes/pyrefly-torch-stubs/examples/super_slomo.py"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e1f9e311dc663268d006177b3b7729ba6aa5c490892bcdcdff3884d66f228a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): tensor-shapes/pyrefly-torch-stubs/examples/unet.py:115-119 | tensor-shapes/pyrefly-torch-stubs/examples/unet.py:145-149 \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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tensor-shapes/pyrefly-torch-stubs/examples/unet.py"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"10f7e27ce1198afc1f62c326641495160d3a0eacabbf0715cf700fbda312f4ca"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: NestingContext (LCOM4 5): NestingContext\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/pyrefly_python/src/nesting_context.rs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3bc35885e4c576e55d555649b75267c1dc60af18fcfac51a587233bdad5fb89"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Solver (LCOM4 4): Solver\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"eba75728542f7fb2a32b63671e559c5262f34d0265dc31dacaef59ff372929c7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/solver/subset.rs: pyrefly/lib/solver/subset.rs changed 85 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 240 in Subset::is_subset_eq_no_recursive_check at line 1877. 9 of those changes were fix/bug commits, and the other 76 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/solver/subset.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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1877}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3663348591fec924795283dc8e6dc310d11c07ad5713848e0f2feb717c85bcf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_types/src/type_level_dsl.rs: crates/pyrefly_types/src/type_level_dsl.rs changed 82 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 247 in StructurallyValidatedTypeShapeDslFunction::evaluate_expression at line 6770. 2 of those changes were fix/bug commits, and the other 80 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_types/src/type_level_dsl.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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6770}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca6e7770413d45cf3f8e76aaa00d384617a787d81d0da5b20b1751d4e3afcfad"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/expr.rs: pyrefly/lib/alt/expr.rs changed 150 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 84 in AnswersSolver::subscript_infer_for_type_with_key_present_inner at line 3367. 7 of those changes were fix/bug commits, and the other 143 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3367}}}],"partialFingerprints":{"codehealthFindingId/v1":"72276db1689db1c086d38aa2ec8b76d7ce49400a1ce2a31342da664669221661"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_types/src/display.rs: crates/pyrefly_types/src/display.rs changed 67 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 148 in TypeDisplayContext::fmt_helper_generic at line 917. 7 of those changes were fix/bug commits, and the other 60 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_types/src/display.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":"crates/pyrefly_types/src/display.rs"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a7fc47afa24c376f467a92ab38cb8b31c1d6f3b7d366066649b716fd9e7d24b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/solve.rs: pyrefly/lib/alt/solve.rs changed 156 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 62 in AnswersSolver::binding_to_type at line 6303. 10 of those changes were fix/bug commits, and the other 146 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/solve.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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6303}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dd186018a8c5263d7bdf0641401f6482364f6a3dadeca55e3ccb728b31d724c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/lsp/non_wasm/server.rs: pyrefly/lib/lsp/non_wasm/server.rs changed 75 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 128 in Server::process_event at line 2054. 12 of those changes were fix/bug commits, and the other 63 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/lsp/non_wasm/server.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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":2054}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a12c950571ab7a071eb0e7b7e1f38ba40440667fc1ff9bed3f074dfa03b6b51"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/class/class_field.rs: pyrefly/lib/alt/class/class_field.rs changed 77 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 119 in AnswersSolver::calculate_class_field at line 1524. 18 of those changes were fix/bug commits, and the other 59 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/class/class_field.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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1524}}}],"partialFingerprints":{"codehealthFindingId/v1":"591c4a85794526e142af185a5d8b163c79bbfb0a7b74ece35598453fbbe92159"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/callable.rs: pyrefly/lib/alt/callable.rs changed 55 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 136 in AnswersSolver::callable_infer_params at line 894. 6 of those changes were fix/bug commits, and the other 49 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/callable.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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":894}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f839da764979dba181a6a8e088d9da7f3dfdaebd24579642012d77bb363aa2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/call.rs: pyrefly/lib/alt/call.rs changed 83 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 88 in AnswersSolver::as_call_target_impl at line 378. 11 of those changes were fix/bug commits, and the other 72 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/call.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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d4a8471b0759a3d56bc7bbfb26e9b438b88419cc00e02564b7167849c193b7c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/type_level_dsl.rs: pyrefly/lib/alt/type_level_dsl.rs changed 72 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 75 in AnswersSolver::validate_type_shape_dsl_declaration at line 289. 1 of those changes was a fix/bug commit, and the other 71 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-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/type_level_dsl.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":"pyrefly/lib/alt/type_level_dsl.rs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"639c36861fb1ab5679097542b973a139ffd8a203263546b425d5ade71c17474b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/stmt.rs: pyrefly/lib/binding/stmt.rs changed 34 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 157 in BindingsBuilder::stmt_impl at line 847. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/stmt.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":"pyrefly/lib/binding/stmt.rs"},"region":{"startLine":847}}}],"partialFingerprints":{"codehealthFindingId/v1":"40d0d8effc49010e341b658222cd5e7987abcde07dad11542ee2daf29ba64ff0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/solver/solver.rs: pyrefly/lib/solver/solver.rs changed 97 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in Subset::is_subset_eq_var at line 3727. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/solver/solver.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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3727}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0ec482182551614877f4a81cadc63334788d9fffe8d38a802af998f97d774c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/binding.rs: pyrefly/lib/binding/binding.rs changed 70 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 74 in Binding::fmt at line 2699. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/binding.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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":2699}}}],"partialFingerprints":{"codehealthFindingId/v1":"13980894aa5b0aef35507220e39027feb7d8c6caba173a247c0cea092ffa31ac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/attr.rs: pyrefly/lib/alt/attr.rs changed 61 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 77 in AnswersSolver::lookup_attr_static1 at line 1737. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/attr.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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":1737}}}],"partialFingerprints":{"codehealthFindingId/v1":"99da448684159686006a6d55753ab393e530e701eb82e9a14a1a470e7399d855"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/narrow.rs: pyrefly/lib/alt/narrow.rs changed 39 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 119 in AnswersSolver::atomic_narrow at line 1352. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/narrow.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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1352}}}],"partialFingerprints":{"codehealthFindingId/v1":"b40467b0f7ffe95683dfb4d80d468ae89cee62d098ec8d2b46e84c91018ba1ef"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_config/src/error_kind.rs: crates/pyrefly_config/src/error_kind.rs changed 47 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 68 in ErrorKind::default_severity at line 567. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_config/src/error_kind.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":"crates/pyrefly_config/src/error_kind.rs"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"1692341a9f3365a29bcf201f0f807b60758b82ff9dce36a1f07334b4b249001c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/polars_specials.rs: pyrefly/lib/alt/polars_specials.rs changed 97 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in AnswersSolver::polars_join at line 3225. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/polars_specials.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":"pyrefly/lib/alt/polars_specials.rs"},"region":{"startLine":3225}}}],"partialFingerprints":{"codehealthFindingId/v1":"d79efedf6c8951aa22ea4fcdb606f7362763435c2481ed8523673474f6fb6c5f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_config/src/config.rs: crates/pyrefly_config/src/config.rs changed 49 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 59 in ConfigFile::configure_at at line 1578. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_config/src/config.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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1578}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d8ba96a1e6ebdc8154aef4a1d43b056078ed917038f4f2241b29f45f9353cba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/state/lsp.rs: pyrefly/lib/state/lsp.rs changed 62 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 46 in Transaction::find_definition at line 2676. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/state/lsp.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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2676}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d68a09776663c07c668cf1293748aa0df75999e0cb25bcc12b9df40cb046dcf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_types/src/types.rs: crates/pyrefly_types/src/types.rs changed 49 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 53 in Type::recurse at line 1053. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_types/src/types.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":"crates/pyrefly_types/src/types.rs"},"region":{"startLine":1053}}}],"partialFingerprints":{"codehealthFindingId/v1":"4949b565a87e92843a09a69fb34932590dc801dcc8d6c7c2b7e488422347b07d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/function.rs: pyrefly/lib/alt/function.rs changed 66 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 39 in AnswersSolver::decorated_function_type at line 765. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/function.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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"038d178072b7d33166c42ed6783de6c02ab6c1053fb3541308a448f36810ec2f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/commands/check.rs: pyrefly/lib/commands/check.rs changed 46 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in CheckArgs::finish_cli_run at line 1893. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/commands/check.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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":1893}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb565fe8331f168a61a76f8131eaf11b0499c17e5aaa34b0f101be325635b963"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/state/state.rs: pyrefly/lib/state/state.rs changed 56 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in Transaction::demand at line 1457. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/state/state.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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1457}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc573498932c17276d70c00e7a6f6bcdbe435c7ca8f6092c8d2e97cae45f71e5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/tsp/type_conversion.rs: pyrefly/lib/tsp/type_conversion.rs changed 32 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in TypeConverter::convert at line 225. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/tsp/type_conversion.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":"pyrefly/lib/tsp/type_conversion.rs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7e2312d7c44de92977b8c7378a7a5546b738efc1869d7ac097b411dede905e7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/pattern.rs: pyrefly/lib/binding/pattern.rs changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 76 in BindingsBuilder::bind_pattern at line 284. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/pattern.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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"8436fcad2dc1e90cda68def60fdf75dd37a67eb15533b1d40140e1da4ce37005"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/class/class_metadata.rs: pyrefly/lib/alt/class/class_metadata.rs changed 32 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in AnswersSolver::class_metadata_of at line 182. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/class/class_metadata.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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a2ed0b919724248ba7a78c730666fc1b3ba62529acfd3d6b7ea0972248ef770"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/expr.rs: pyrefly/lib/binding/expr.rs changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 78 in BindingsBuilder::ensure_expr at line 712. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"35e72806503440705335d4d86a0d145356e5c36d52bac4e4a7c28cb76143e8e5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/operators.rs: pyrefly/lib/alt/operators.rs changed 33 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in AnswersSolver::try_int_binop at line 94. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/operators.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":"pyrefly/lib/alt/operators.rs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9169a50f7a7020cbf846d1b75f5374c12ce2dd00ed271d433c8bfcdbdbb1acc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/commands/coverage/collect.rs: pyrefly/lib/commands/coverage/collect.rs changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in pyrefly::lib::commands::coverage::collect::parse_functions at line 755. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/commands/coverage/collect.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":"pyrefly/lib/commands/coverage/collect.rs"},"region":{"startLine":755}}}],"partialFingerprints":{"codehealthFindingId/v1":"a46da5f040d8455df466e6914f7dcf07cb7b246ff237e1229f0f30c082603677"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_types/src/meta_shape_dsl.rs: crates/pyrefly_types/src/meta_shape_dsl.rs changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in pyrefly_types::meta_shape_dsl::eval_dsl_expr at line 2373. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_types/src/meta_shape_dsl.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":"crates/pyrefly_types/src/meta_shape_dsl.rs"},"region":{"startLine":2373}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1cb06760ae3ff6b5f607932efc991df7c3261438d154cb171ca601ad3ff5a7b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/lsp/wasm/inlay_hints.rs: pyrefly/lib/lsp/wasm/inlay_hints.rs changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 49 in Transaction::inlay_hints at line 234. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/lsp/wasm/inlay_hints.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":"pyrefly/lib/lsp/wasm/inlay_hints.rs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"f33dce5df98a66e366451263124cd1d9c7088a9d5a508dc7c3fc9fe31871c503"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/query/type_table.rs: pyrefly/lib/query/type_table.rs changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 51 in pyrefly::lib::query::type_table::type_to_indexed_shape at line 266. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/query/type_table.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":"pyrefly/lib/query/type_table.rs"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8d338474b556269f0fc683f5434e3163b9e0e9ba939d427362aa190c9196990"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/export/special.rs: pyrefly/lib/export/special.rs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 78 in SpecialExport::new at line 97. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/export/special.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":"pyrefly/lib/export/special.rs"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0dec4b235e96636828e6a05e66fe001afff0c0ebd0f6fabffc8609edfd073d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/functools.rs: pyrefly/lib/alt/functools.rs changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 48 in AnswersSolver::call_functools_partial at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/functools.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":"pyrefly/lib/alt/functools.rs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c06546e1bf6f87b58baab818bc262ab1895ee413141e1640b70a4c01eed03e3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/bindings.rs: pyrefly/lib/binding/bindings.rs changed 57 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in BindingsBuilder::stmts at line 1321. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/bindings.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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":1321}}}],"partialFingerprints":{"codehealthFindingId/v1":"3efa5207d61775f55f9cfcad18f65635aaed80040ddcdbc9b3558ebf67ce361a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/lsp/wasm/completion.rs: pyrefly/lib/lsp/wasm/completion.rs changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in Transaction::completion_sorted_opt_with_incomplete at line 1068. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/lsp/wasm/completion.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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":1068}}}],"partialFingerprints":{"codehealthFindingId/v1":"3630038ac7ff96250278d252b536dd9fc9e4bf8832d37d90f4fd96c78d98d2a7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/function.rs: pyrefly/lib/binding/function.rs changed 29 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in pyrefly::lib::binding::function::function_last_expressions at line 976. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/function.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":"pyrefly/lib/binding/function.rs"},"region":{"startLine":976}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c80301e0aa65c52e40a241193e25f8f216d20de6dc5dbf01e0b868efb2b870"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/query.rs: pyrefly/lib/query.rs changed 34 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in CalleesWithLocation::callee_from_type at line 943. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/query.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":"pyrefly/lib/query.rs"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebeb998e62229a3c95f71b936512a07d94b2a4437cded8a6600e55f05d014c95"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/scope.rs: pyrefly/lib/binding/scope.rs changed 36 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in BindingsBuilder::merged_flow_info at line 3903. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/scope.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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":3903}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e9f8ff6154759477a5126ac03e501f94fe03fd752208556cc0534ac5e4ecaae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/narrow.rs: pyrefly/lib/binding/narrow.rs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 55 in NarrowOps::from_expr_helper at line 889. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/narrow.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":"pyrefly/lib/binding/narrow.rs"},"region":{"startLine":889}}}],"partialFingerprints":{"codehealthFindingId/v1":"0754c67c741b3907c63a9d821632293c2fcccc8eef1e0116b21e59212cde2824"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/report/cinderx/convert.rs: pyrefly/lib/report/cinderx/convert.rs changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in pyrefly::lib::report::cinderx::convert::type_to_structured at line 177. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/report/cinderx/convert.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":"pyrefly/lib/report/cinderx/convert.rs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed314ef63d0fa699f38877d10f8dd7c023c0e0b4832abfbfd1e6d9cda971f362"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/class/variance_inference.rs: pyrefly/lib/alt/class/variance_inference.rs changed 30 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in pyrefly::lib::alt::class::variance_inference::on_type at line 374. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/class/variance_inference.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":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f56f4a9119ad27f01fe880eb742edbe424bae216bc757024882456036fc650e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/module/finder.rs: pyrefly/lib/module/finder.rs changed 27 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in pyrefly::lib::module::finder::find_import_with_mode at line 592. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/module/finder.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":"pyrefly/lib/module/finder.rs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8bbc1dd2c5a8b35c55e4f0c493beef66555df24db6a6e885226109472b07cdc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_types/src/dimension.rs: crates/pyrefly_types/src/dimension.rs changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in pyrefly_types::dimension::canonicalize_division at line 933. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_types/src/dimension.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":"crates/pyrefly_types/src/dimension.rs"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"e55f0aa33b80072fadec950789b1e0dfa04f1a69ef168614c177e7b6f05c8be5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/export/definitions.rs: pyrefly/lib/export/definitions.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 90 in DefinitionsBuilder::stmt at line 559. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/export/definitions.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":"pyrefly/lib/export/definitions.rs"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8718d77686a037e6cfbe7435e83b887e236444d29fb1cac3d6c5ea47fa189ab"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/class/dataclass.rs: pyrefly/lib/alt/class/dataclass.rs changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in AnswersSolver::get_dataclass_synthesized_fields at line 132. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/class/dataclass.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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0eddb69e770156a5f1a5f70be658105fc843eac3303866883ce7c6cbfc498f6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/state/errors.rs: pyrefly/lib/state/errors.rs changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in Errors::collect_unused_ignore_errors at line 533. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/state/errors.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":"pyrefly/lib/state/errors.rs"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fd4726fc7a01eb1ab4c91f68a4e2dd89478f504271ff60d56083231f88030a6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_config/src/args.rs: crates/pyrefly_config/src/args.rs changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in ConfigOverrideArgs::override_config_at at line 547. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_config/src/args.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":"crates/pyrefly_config/src/args.rs"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a699c3388c104555324d76c45bf874aeac15828a1b48cb18d2ff2cb8e7441ff"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/overload.rs: pyrefly/lib/alt/overload.rs changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in AnswersSolver::find_closest_overload at line 840. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/overload.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":"pyrefly/lib/alt/overload.rs"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb0c704889e5d4c7df5072dcb0483e2b0b104f4eece88c789f1ddfb57cd5a85e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_types/src/function.rs: crates/pyrefly_types/src/function.rs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in FunctionKind::module_name at line 543. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_types/src/function.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":"crates/pyrefly_types/src/function.rs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"69fdd04a7aa868718c7d9643fd47dae1f78b60d16fe12fee6771c9a1c0cb0d29"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/lsp/wasm/hover.rs: pyrefly/lib/lsp/wasm/hover.rs changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in pyrefly::lib::lsp::wasm::hover::get_hover_with_verbosity at line 930. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/lsp/wasm/hover.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":"pyrefly/lib/lsp/wasm/hover.rs"},"region":{"startLine":930}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9cfd8797907e3b6fb411261fd06ed0695496132e1982cf4e4d16bf937612bf2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/special_calls.rs: pyrefly/lib/alt/special_calls.rs changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in AnswersSolver::call_typing_cast at line 390. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/special_calls.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":"pyrefly/lib/alt/special_calls.rs"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9c3f16b7560fc1c2ba85af1e1fa88138d2c3a9cbfdf7364a0f07ec50940958"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/class.rs: pyrefly/lib/binding/class.rs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in BindingsBuilder::class_def_inner at line 245. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/class.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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"f44bf0d2deda5cbfb85823175255195b7141320f65e80911122c28fd08f2685d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/class/django.rs: pyrefly/lib/alt/class/django.rs changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in AnswersSolver::solve_django_reverse_relations at line 734. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/class/django.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":"pyrefly/lib/alt/class/django.rs"},"region":{"startLine":734}}}],"partialFingerprints":{"codehealthFindingId/v1":"76d684aa987bc5a53f404e6432e290d86abb7f29daabc570c91f399f4e6ebbac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: lsp/src/extension.ts: lsp/src/extension.ts changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in extension.activate at line 234. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- lsp/src/extension.ts\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":"lsp/src/extension.ts"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b434326ba32184f3b3663783017208e2deca9f4b1bfeae1860d76ec4880f22"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_python/src/sys_info.rs: crates/pyrefly_python/src/sys_info.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 41 in SysInfo::evaluate at line 898. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_python/src/sys_info.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":"crates/pyrefly_python/src/sys_info.rs"},"region":{"startLine":898}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7ab53f68159c5ad9877dd422afdc5b7d8c58563c0ca38457cfac5a44bb01294"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/class/pydantic.rs: pyrefly/lib/alt/class/pydantic.rs changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in AnswersSolver::pydantic_config at line 323. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/class/pydantic.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":"pyrefly/lib/alt/class/pydantic.rs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb8ee0e5b01a828707034ead5cc62315bce8de6f7cb62db328cc50b526cf8e7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/error/suppress.rs: pyrefly/lib/error/suppress.rs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in pyrefly::lib::error::suppress::remove_unused_ignores_from_serialized at line 636. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/error/suppress.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":"pyrefly/lib/error/suppress.rs"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"3af0870ee45cae31095e4390d562c9814a3db7567a7747cf3973764f350b9e60"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_build/src/module_resolver.rs: crates/pyrefly_build/src/module_resolver.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in pyrefly_build::module_resolver::find_one_part_in_root at line 360. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_build/src/module_resolver.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":"crates/pyrefly_build/src/module_resolver.rs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"939d0756684c4e3fdd83e411f1a37649877bbbe34217e333a88accfcf1b85d29"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/target.rs: pyrefly/lib/binding/target.rs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in BindingsBuilder::bind_single_name_assign at line 651. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/target.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":"pyrefly/lib/binding/target.rs"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"22549a84d09e8f7ee335046152328cdf987d57508469d4b72d2f8dde3912a477"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/shape_flag.rs: pyrefly/lib/alt/shape_flag.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in AnswersSolver::check_shape_flag_constructor_sources at line 117. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/shape_flag.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":"pyrefly/lib/alt/shape_flag.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"498897de531908f84b5c3c2e24870d7ae3deff2d02fa99c7ae886b3ac60869b3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/types/class_bases.rs: pyrefly/lib/alt/types/class_bases.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in AnswersSolver::class_bases_of at line 271. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/types/class_bases.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":"pyrefly/lib/alt/types/class_bases.rs"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"aee1a320f734e05faed1bb6c2d18b1b097943af43dab0da3e812d30629737935"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/class/typed_dict.rs: pyrefly/lib/alt/class/typed_dict.rs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in AnswersSolver::check_dict_items_against_typed_dict at line 79. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/class/typed_dict.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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"c776fb41c126616abc2d7caed869189f878ca8582be10c8dd6f7a1b7f9d823ba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/specials.rs: pyrefly/lib/alt/specials.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in AnswersSolver::apply_special_form at line 343. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/specials.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":"pyrefly/lib/alt/specials.rs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e00a3e16dc8a08dff0abcd06a1f2a1d99fda26d97889e0936d3c7b6434f6ad"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/shape_type.rs: pyrefly/lib/binding/shape_type.rs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in BindingsBuilder::extract_shaped_array_metadata at line 543. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/shape_type.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":"pyrefly/lib/binding/shape_type.rs"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f4a540ccea13ce7bdd8a6fce9e916d9cfc44da16c3217b377a8ac1661c07b00"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_config/src/migration/mypy/pyproject.rs: crates/pyrefly_config/src/migration/mypy/pyproject.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in pyrefly_config::migration::mypy::pyproject::pyproject_to_ini at line 128. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_config/src/migration/mypy/pyproject.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":"crates/pyrefly_config/src/migration/mypy/pyproject.rs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bf81bc04076ccefed52632f39ccf203274fabdf4515aa059f0a277d13e7c0ca"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/error/display.rs: pyrefly/lib/error/display.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in TypeCheckKind::format_error at line 63. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/error/display.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":"pyrefly/lib/error/display.rs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"1509ae1ebd98a71b1d200dbeb8ab7c2ddf64d9d9fd34780dd9588650fdde67a6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/lsp/non_wasm/workspace.rs: pyrefly/lib/lsp/non_wasm/workspace.rs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in Workspaces::apply_client_configuration at line 555. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/lsp/non_wasm/workspace.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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"e19884804b3fe90de666879d2e1832371e9d7cba31d8ae1d504921716208c7ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/error/context.rs: pyrefly/lib/error/context.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in TypeCheckKind::as_error_kind at line 238. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/error/context.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":"pyrefly/lib/error/context.rs"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b1a201a810fc10d93154afddd8f275f905a764304803a5f48b6a1713fe62266"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_types/src/polars_dtype.rs: crates/pyrefly_types/src/polars_dtype.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in PolarsScalarDType::supertype at line 138. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_types/src/polars_dtype.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":"crates/pyrefly_types/src/polars_dtype.rs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"33a758836532a1fb7f4b272259cb6bf2e108b2878ab525e723b9e21fca507983"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/state/semantic_tokens.rs: pyrefly/lib/state/semantic_tokens.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 36 in SemanticTokenBuilder::process_stmt at line 528. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/state/semantic_tokens.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":"pyrefly/lib/state/semantic_tokens.rs"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"7361a1b35af678b0b7f4e1e0661459cb583a97d28651b23fdbfcc54233e9363c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/state/lsp/dict_completions.rs: pyrefly/lib/state/lsp/dict_completions.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in Transaction::extend_dict_key_suggestions at line 942. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/state/lsp/dict_completions.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":"pyrefly/lib/state/lsp/dict_completions.rs"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"31f22fb5a3b80d1dabb89c39ff0ca87f2bf2556b507f4531899047eafdffd01a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_python/src/ignore.rs: crates/pyrefly_python/src/ignore.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in pyrefly_python::ignore::parse_ignore_all at line 652. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_python/src/ignore.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":"crates/pyrefly_python/src/ignore.rs"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d2432b5b6804a781bc7eb31083fcb32bac2b8d63abda5677e1cf1d2bfa88e27"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/state/ide.rs: pyrefly/lib/state/ide.rs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in pyrefly::lib::state::ide::create_intermediate_definition_from at line 140. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/state/ide.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":"pyrefly/lib/state/ide.rs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd35193adaaeaad67e75686c28689ac24dd4ad574710eab39667fe53c314c5b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/alt/class/tparams.rs: pyrefly/lib/alt/class/tparams.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in AnswersSolver::calculate_class_tparams at line 44. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/alt/class/tparams.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":"pyrefly/lib/alt/class/tparams.rs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd739b9e4317824ae0c11faf5f57e943330e7dc865f604fc6d57e0a64a31ee32"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/commands/infer.rs: pyrefly/lib/commands/infer.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in pyrefly::lib::commands::infer::format_hints at line 186. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/commands/infer.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":"pyrefly/lib/commands/infer.rs"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"102aa47c371a48a448f7b3f04e745a5a6608fde7ba12927cb13f5d004f2e6b9a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_config/src/migration/ignore_missing_imports.rs: crates/pyrefly_config/src/migration/ignore_missing_imports.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in IgnoreMissingImports::migrate_from_mypy at line 37. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_config/src/migration/ignore_missing_imports.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":"crates/pyrefly_config/src/migration/ignore_missing_imports.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c2705226656e6492b88a3acf06f1326bcd12dc1bc9f72ccda6673a18664242a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_python/src/folding.rs: crates/pyrefly_python/src/folding.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in pyrefly_python::folding::folding_ranges at line 30. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_python/src/folding.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":"crates/pyrefly_python/src/folding.rs"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"84527015426b20341ae7bc5ea66fdca87de3c9b2fb07b4f3db82317c1de8254c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/state/lsp/quick_fixes/inline_variable.rs: pyrefly/lib/state/lsp/quick_fixes/inline_variable.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in pyrefly::lib::state::lsp::quick_fixes::inline_variable::inline_variable_code_actions at line 29. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/state/lsp/quick_fixes/inline_variable.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":"pyrefly/lib/state/lsp/quick_fixes/inline_variable.rs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b97261310ab0d13adae5ad101d94899bac3920669781ecae2aa2ebb2ccf353"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_config/src/migration/mypy/util.rs: crates/pyrefly_config/src/migration/mypy/util.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in pyrefly_config::migration::mypy::util::code_to_kind at line 198. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_config/src/migration/mypy/util.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":"crates/pyrefly_config/src/migration/mypy/util.rs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e872601d9142a3fbb8e93964449bb3e7d01eff90967c158ac451405e39e6d15"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/report/pysa/module_index.rs: pyrefly/lib/report/pysa/module_index.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in PysaModuleIndex::build at line 141. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/report/pysa/module_index.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":"pyrefly/lib/report/pysa/module_index.rs"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c99bf4e610edfe11b27e7a7f4c4d6a34691259f592b01699e58969c413cc266"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/attrs.rs: pyrefly/lib/binding/attrs.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in pyrefly::lib::binding::attrs::collect_attrs_decorator_methods at line 94. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/attrs.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":"pyrefly/lib/binding/attrs.rs"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"b60172209fba344b2fe4a5372d6b657506b941334f25ee0d0b285eb735f1b8a9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/pydantic.rs: pyrefly/lib/binding/pydantic.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in BindingsBuilder::extract_pydantic_config_dict at line 280. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/pydantic.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":"pyrefly/lib/binding/pydantic.rs"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"975bf0462b78e190645547993709da168e3a7ff3e6583e80843b78990fcec9b2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/report/pysa/types.rs: pyrefly/lib/report/pysa/types.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in pyrefly::lib::report::pysa::types::get_classes_of_type at line 263. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/report/pysa/types.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":"pyrefly/lib/report/pysa/types.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ce2f2a35a3d1c297febb6f8e7d4c6d46b85c27f1238af69705f0f520b1c6608"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/lsp/non_wasm/document_symbols.rs: pyrefly/lib/lsp/non_wasm/document_symbols.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in pyrefly::lib::lsp::non_wasm::document_symbols::recurse_stmt_adding_symbols at line 195. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/lsp/non_wasm/document_symbols.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":"pyrefly/lib/lsp/non_wasm/document_symbols.rs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c76532b9e8aa89cd57aa240adae94329cf98ddcfa6076747ce12ce2ee8cf58e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/pyrefly_types/src/einsum.rs: crates/pyrefly_types/src/einsum.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in pyrefly_types::einsum::parse_einsum_equation at line 418. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_types/src/einsum.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":"crates/pyrefly_types/src/einsum.rs"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"3593d1d681a3ac3e64b431a8f377851dd852dc5c0cf9d9d13a8c1cb463eeb444"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: pyrefly/lib/binding/django.rs: pyrefly/lib/binding/django.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in BindingsBuilder::extract_django_fields_from_class_body at line 40. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- pyrefly/lib/binding/django.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":"pyrefly/lib/binding/django.rs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fc95ecdfa3d8a9c2c73d7f734e54e2bc05473fbf89502020664c36dba52ddc5"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: crates/pyrefly_python/src/module_name.rs: crates/pyrefly_python/src/module_name.rs changed 6 times in last 90 days and 4 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 13 (its worst body is ModuleName::from_path_impl at line 488), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix pydantic - Strict types are not treated as strict mode #3543 (#3565)\u201D; \u201Cfix Django REST Framework: false positives on serializer declared fields (named like Field attrs) and inner Meta #3933 (#4630)\u201D; \u201Cfix djangorestframework-stubs: ModelSerializer.Meta class pattern causes false positive bad-override errors #4595 (#4599)\u201D; \u201Cfix Pydantic alias_generator (#2946)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-01..2026-09-29, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-01 01:37:31 -07:00\u0027 --until=\u00272026-09-29 01:37:31 -07:00\u0027 --full-history --no-merges -- crates/pyrefly_python/src/module_name.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":"crates/pyrefly_python/src/module_name.rs"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a3ae618ec6459207a5356adff42cf36bccf203cbe21f1aec7a02186dd9e58af"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 11 significant file(s) lose their only recent owner: crates/pyrefly_types/src/type_level_dsl.rs, pyrefly/lib/alt/type_level_dsl.rs, pyrefly/lib/binding/shape_type.rs, crates/pyrefly_types/src/type_var/flag.rs, pyrefly/lib/alt/shape_flag.rs, tensor-shapes/pyrefly-shape-extensions/shape_extensions/__init__.py, pyrefly/lib/report/cinderx.rs, tensor-shapes/pyrefly-shape-extensions/shape_extensions/torchscript.py (\u002B3 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2604fed8301f63291065e29f9b523de715e562ff13100ba9400abd0dbef8528c"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 10 significant file(s) lose their only recent owner: scripts/primer_classifier/llm_client.py, scripts/compare_typecheckers.py, scripts/issue_ranker/v1_analysis.py, scripts/primer_classifier/formatter.py, scripts/issue_ranker/__main__.py, scripts/issue_ranker/passes/primer_impact.py, scripts/llm_transport.py, scripts/issue_ranker/passes/score.py (\u002B2 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7d90187403a2af1f2e3ac6c135e71fe36f749fa0ada20cd97ad51f6581fcca20"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 5 significant file(s) lose their only recent owner: crates/pyrefly_util/src/visit.rs, crates/pyrefly_util/src/watcher.rs, crates/pyrefly_derive/src/visit.rs, crates/pyrefly_derive/src/type_eq.rs, crates/pyrefly_util/src/with_hash.rs. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"35085e96d1e0971fbbc53cd8ee981b4929c5f81ea317067e176a6df181d55345"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 4 significant file(s) lose their only recent owner: pyrefly/lib/lsp/non_wasm/connection.rs, lsp/src/python-environment.ts, crates/pyrefly_util/src/timer.rs, crates/pyrefly_python/src/deprecated_aliases.rs. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"678a29a0e4ac5ff84e87245ee7ce194661aa4452801be3ea654795f0a18af1b3"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 12 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 (49 single-owned of 407 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; 407 of the 520 production source files in this repository met that bar). They are anonymized user #5 (2 file(s)), anonymized user #6 (2 file(s)), anonymized user #7 (2 file(s)), anonymized user #8 (2 file(s)), anonymized user #9 (2 file(s)), anonymized user #10 (2 file(s)) (\u002B6 more) \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":"TodoComment: // TODO(connernilsen): remove once internal stubs are deprecated \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":"crates/pyrefly_build/src/lib.rs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"71cc68e27c1a3c7a2c9f5cdcf4389d64165d2957993e7c17f6ca78b2cf7d0e0c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): pull this out into per-config lookup, so build system can be shared with \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":"crates/pyrefly_build/src/lib.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"0735da68443fbdba641c39ad1a4b70cfe4545107d2a9259ce6c5469458d11908"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(grievejia): Only docify stdlib for now \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":"crates/pyrefly_bundled/update.py"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"faa54f3877bf7373c880196f1e283d201a28045ea66dc688767ae072e40d98ac"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b21a02cd1e795592bf2f8e84ab8838c889e0bcb2ece528c7d7e6e72747d47fb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c4dfd2fe9ee3d7401dc2b3a304925f5a6e951a5440eaff5c6baff3bebf31d12"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":626}}}],"partialFingerprints":{"codehealthFindingId/v1":"13a846bb7539759a9bace665becb4ec7412282442d7c2736725bc4c17ed23318"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":703}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b2ee1e0495afc9ed4fd18bf9abce3639dd42c4b7118e13d2b2eba0fb6800e34"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/base.rs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"08469cfed7f4abe90c15ccf87ea2d0b5ffaceeeb77798daa7cb7f314e9785eb9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/base.rs"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0de46c4f0135e06a731a88031e1cf6c8fc53bd4f13c4514602227f5c93afe77"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/base.rs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"59489c9f47cc46f24a2648827d9e73e2b236c797ac3b5ef67ab6ac19432391f2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/environment/interpreters.rs"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"034f733fa4f7943777b645851b224c0989d3aa60d2128102c09feb750e31e061"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/environment/environment.rs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"543e7c869b605978389f3a1afc9679d96c359a7b59a6672beed633b1fcec8a11"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/environment/environment.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b4e3a0df6f8fd75e2868bf84dd9cdfff6e8364c0799606c96ab61718230fc14"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): DON\u0027T COPY THIS TO NEW FIELDS. This is a temporary \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":"crates/pyrefly_config/src/environment/environment.rs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"93ab5b991d77f12bca1fedef1580fa71b1736567ef59d9ed7714750cf5f5794a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: \u0022recommended\u0022 in basedpyright does enable all rules, but sets the severity to warning \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":"crates/pyrefly_config/src/migration/type_checking_mode.rs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c4fc77f154b089d978a174a7787cf70dfe15e223cf38bc9aff37b6d09e8687"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This code is written in a fairly weird style. Give it a nicer interface \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":"crates/pyrefly_config/src/migration/run.rs"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"724de01d371a6580c5aee4a32184544c343d2dc5e6aff9e95cbebbf54ac3c95f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(samzhou19815): modifier for async \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":"crates/pyrefly_python/src/symbol_kind.rs"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"c499bec32a6694ea39c4b5245f952013a56bb711a7e7bc8517f799db72823adb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This is wrong. The relative level 4 should be invalid \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":"crates/pyrefly_python/src/module_name.rs"},"region":{"startLine":623}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59a5a38c24b2c8ddf0c7ee27a9b5f08f082078169ece2e29cbf057eda9c5503"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should mostly be forcing these before printing \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":"crates/pyrefly_types/src/types.rs"},"region":{"startLine":2165}}}],"partialFingerprints":{"codehealthFindingId/v1":"137959e51fdcef2d3cf97b6a46cd4ab5afc18a526e8074d8da51dec7b70fc84b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: properly take parent from caller of 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":"crates/pyrefly_types/src/type_var_tuple.rs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8593d1f22ef36b3912a6795f624da49be2ced9c143f399610eb9b42cb0e8aff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: properly take parent from caller of 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":"crates/pyrefly_types/src/type_var.rs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"c64e7cf130cee56fd3e47284b3b97b623d577fbda44adeecd14217c9d2c106e5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: properly take parent from caller of 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":"crates/pyrefly_types/src/param_spec.rs"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"531f9a688a653702584926db5918ac3c872d21cdfe53fc442b657450cfbdf6e2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Isolate deferred integer union-find state and AST revalidation behind 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":1934}}}],"partialFingerprints":{"codehealthFindingId/v1":"b77c1493f0e26c433ec7882ff83ebdc77a21d14ad3dc925a31e30e1cc7484ec4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Compile validated expressions into a small IR so evaluation does not need \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":6423}}}],"partialFingerprints":{"codehealthFindingId/v1":"084f7898d4509d77983e3db7589f279775e63bdee45774f2d8c82d37ac7d7e12"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Preserve a gradual product as a gradual dimension 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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7273}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb1924971fa94ca6c0c998a9d9385ee2e23507405bbd7c608e845102f8595a36"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Compile validated conditions into the same IR rather than traversing their \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":"crates/pyrefly_types/src/type_level_dsl.rs"},"region":{"startLine":7793}}}],"partialFingerprints":{"codehealthFindingId/v1":"b08efd0de39b23b7daf308fd594eb56b5f445c4b2e291406b50453c079c40fad"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Flatten these instead of giving 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":"crates/pyrefly_types/src/simplify.rs"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0d8ee2c510af51261e92159f0decbfad956dc845ab64938fcb456cded02120"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(kylei): remove this hack once ms-python has this behavior \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":"lsp/src/extension.ts"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"903c0b752c9e8d3b7c072748470c3740cb90d091e2f781da458b3e36cdc37020"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(kylei): remove this hack once ms-python has this behavior \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":"lsp/src/extension.ts"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c9f863f5262f08d18113e951e53deb601133b52067d840fc7fad454022a811d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use type of receiver \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":"pyrefly/lib/query.rs"},"region":{"startLine":684}}}],"partialFingerprints":{"codehealthFindingId/v1":"127720edb86962ba12dcf5cc012e589e15cf03e2baa09ab6158c6472b611c4b1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: wrap in \u0027type\u0027 \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":"pyrefly/lib/query.rs"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"60ceb3a97d78d66950a99ab70569ebbf711ec80c4be40832e42724e0a8c6e15b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: decide what do to with multiple definitions \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":"pyrefly/lib/query.rs"},"region":{"startLine":852}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6172c99e4bda1866402dfd991aac61983d71acbae9fb049f2a61dc7030e4cd5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): make this work with build systems \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":"pyrefly/lib/query.rs"},"region":{"startLine":1077}}}],"partialFingerprints":{"codehealthFindingId/v1":"c23a6b1e31288482eb6c8944e9c262cf5ddefca9b96f9efd690c3d2b66516d5e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// - TODO: if \u0060ty\u0060 is bottom (\u0060Never\u0060 or \u0060NoReturn\u0060), the subtype check \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":"pyrefly/lib/alt/unwrap.rs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bd039dd1240081b7020447640c51b848adde3c08d4c400ef7bbae2251573d9e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// - TODO: all edge cases probably need to also be handled when they are \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":"pyrefly/lib/alt/unwrap.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"f744211153da607e95827d790f586ba3d040622c3fd9988c4cc62fa27069a705"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(samgoldman) I\u0027m not sure this really makes sense. These bindings should never \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":"pyrefly/lib/alt/traits.rs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"56de7211d804dfae92a46b602b4bd124f6231ef8cd9e612148fe881de58bc553"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler) Revisit the recursive handling, which needs changes in the plumbing \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":"pyrefly/lib/alt/traits.rs"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9036fec1fffce34cb2ebf33e01f4eaabfb9d1e9202c1d0519c3450c16a9558a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: \u0060exit_type\u0060 may also affect exceptional control flow, which is yet to be supported: \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":2086}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea09e0972abb40dec8b30dc8978134ddfe7d611cce2c433a8ce10df748eeba80"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: ideally this would point to where the TypeVar \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3401}}}],"partialFingerprints":{"codehealthFindingId/v1":"857896507d04baa621b3275c833078eafd8ca2929eebabc1e7c56c4c13f0c298"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check that value matches class \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3791}}}],"partialFingerprints":{"codehealthFindingId/v1":"28f6237d4ec9d6c15955e3e83ea683169e27e12f615c119ad6cd70f74f6bf066"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check that value matches class \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6389}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a8ba8f623de1c106c6b4bc212dd534bee13b61d38f27b1e3ec8f8a99e30a9d2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check against duplicate keys (optional) \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":3792}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b86104ed6d2b15816b8355370631a7375d4219fa066e333e362c0f7d5e12f66"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check against duplicate keys (optional) \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6363}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba1231693e83158197e3c0e2e91ebd8830242a4bbb4b91e3a59d0f192dc9a96e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check against duplicate keys (optional) \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6390}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3468ce6d35031fa0936de0d7c053b5602059562a310d63cb337a85be9cffc88"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: A return type annotation like \u0060Final\u0060 is invalid in this context. \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4111}}}],"partialFingerprints":{"codehealthFindingId/v1":"10575af497390bf89699b1405cde2b0951e97c0fcbb005cfae281ad9942a8d12"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: It should always be a no-op to include a \u0060Type::Never\u0060 in unions, but \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4131}}}],"partialFingerprints":{"codehealthFindingId/v1":"02953cc56050160808d5c4895fd6b5a566f3500f1830f3d7c8d1a3ccc357ec89"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): propagate attribute narrows 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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":4994}}}],"partialFingerprints":{"codehealthFindingId/v1":"59730efc0de6200ba907bfad9f51abfeef476b1a1c25b9f2adfe8c60e0be36fd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: handle TypeVarTuple and ParamSpec \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6133}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f7f816aefb23c03b4eaf0e4d7887c0083dc7e867a38581356daefa95d62f9eb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler, rechen): Do we want to include Type::ClassDef(_) \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6230}}}],"partialFingerprints":{"codehealthFindingId/v1":"c76c48a41fb235f4b72f3f41c8c4ed09778c639e7f3937cb3cdcd06dea2f606e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check that value is a mapping \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6362}}}],"partialFingerprints":{"codehealthFindingId/v1":"4053012108d0936a16becf97a4fed71e58310c357b2b6f8a4e7cb65573754f29"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: analyze the class decorators beyond the \u0060Any\u0060 check above. We don\u0027t \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6509}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1fd04f0407e0946b355c6a6ed5b93e9985360a7515e695158c4ad3b04cbf6d1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Keep track of whether the function is async in the binding, decompose hint \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6692}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6fafd4f4aad25e661ac9ce1b2548d677189041f0b5e3fef7484d32df9c9f3f1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This might cause confusing type errors. \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":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":6791}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d6f7f353772d33021153b2e832d41653be996e00483aa4c70bd04cb49a5f9d4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Distinguish quoted canonical bounds from aliases so quoted syntax gets \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":"pyrefly/lib/alt/shape_extension.rs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"46539b75bba619fa217e0ecc94c07a10c6d8b140000889e30a4a91378da309a6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: falling back to Never when the lhs is a union is a hack to get \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":735}}}],"partialFingerprints":{"codehealthFindingId/v1":"e25fee235270f46b49997dad5432caac68e46fcae2b9a9aeffac66f3e4f6e5c2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: falling back to Never when the lhs is a union is a hack to get \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":781}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb7fcb62e81425f3f489403688de457f9f4c9d6e08cae38281820c7460707a52"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: simplify some tuple forms \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":"pyrefly/lib/alt/narrow.rs"},"region":{"startLine":1068}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa069ec51908394ede180b87fa0fd2ac006e30bcc573d894b10a4400da3ef5d3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we could consider checking structural subtyping 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2770}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe7da2c60504301b0b305e31bdccc389034150938937d921e28f85884e6888bd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we could consider checking structural subtyping 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2859}}}],"partialFingerprints":{"codehealthFindingId/v1":"a428a11e966d9e6a925c9e8f0bf7476f60cf50f717bd37e5150a8aa94cbdd837"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: We\u0027re suppressing invalid type variables errors for 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":"pyrefly/lib/alt/function.rs"},"region":{"startLine":2794}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aeacaa7d225d0d311bcc32340e5c065896f4a6f6b7f73ebe36f67c230e05cef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We don\u0027t deal properly with hint here, we should. \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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8cd6736894ebfe795a89f7973e52186767414d08300452696ed5a1c360aed87"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): should we really be producing a \u0060tuple[Any]\u0060 here? We do at least know *something* about the 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1730}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e9c20ab31b3b781a7dc751d0af7285b652d52b2b0477eaf88cb78aa86e43261"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We should also contextually type based on the middle and suffix \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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":1773}}}],"partialFingerprints":{"codehealthFindingId/v1":"739e111bd1ff75bad1b91e1a25c0190f4c320a899269c001ce86177c5c4dfc02"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check and complain on extra args, keywords \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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":2966}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a6ae8e1a5f783996cfe98591e818114f33412f85750ae423550bfee20fc60ae"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle subscription of intersections properly. \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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3397}}}],"partialFingerprints":{"codehealthFindingId/v1":"868722f81b7f185907a2c5b1d756bd1f58cf101cadb348b3a576f0cba9d2b982"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: pyre_extensions.PyreReadOnly is a non-standard type system extension that marks read-only \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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":3463}}}],"partialFingerprints":{"codehealthFindingId/v1":"a79f53a482961ff5624dd6a908f1ab926b73fad9216321e1989a4b8be925ef6a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Add a new API, similar to \u0060type_of_attr_get\u0060 but returning 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":"pyrefly/lib/alt/expr.rs"},"region":{"startLine":4793}}}],"partialFingerprints":{"codehealthFindingId/v1":"65dc7629f9060e2fa93cc97f416451516ca12983eae4e5640134c3853b8eb78c"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // Hack: keep mutable builtin containers as expressions, since they often need to be \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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"13fb003bd93c9bd10a0811d5830ae922d07a1910c40eff3c5e67c8d72c16b077"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: handle second component of Type::Concatenate \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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":1028}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7934b9d9b60e26db962a41b60ccecf9218d2a70a4ce084a0f15ecd147508c42"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): handle nested vars"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":2303}}}],"partialFingerprints":{"codehealthFindingId/v1":"03d9cb8a0b79ac02732ab694597ba06fbcc672e7ae6b127899fbbf2b4334b423"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack: we inserted a class type into the args list, but we need to substitute it \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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":2327}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ce23002c7c9835959b8901c3e7b056268432d1c067d36412da760820f0b88fa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): It is unresolved whether returning the first \u0060Size\u0060 member (rather \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":"pyrefly/lib/alt/callable.rs"},"region":{"startLine":2592}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a534223ffcc747e0a8b90e7a9332bc8b3cff8d698b68ef7f38550efb5b306ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use upper bound to determine input parameters \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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bfa294c2a4d2a2e8722522387ade52493a6bb3b667dba95bab2ae99715789cb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rechen): implement calling \u0060A \u0026 B\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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":663}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a085dbc4bc6df295ea26bc255af88487b17afea40bda035113c58fd745cf4c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rechen): implement calling \u0060type[A \u0026 B]\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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":767}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e7f5ae306379cea584361f7f1542ee6ab1d5a780460193b2c0b24daf3b069bd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: flag incompatible \u0060__new__\u0060 return annotations at the method definition. \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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":1371}}}],"partialFingerprints":{"codehealthFindingId/v1":"85aac1e87ad2a7c8830863078b528b2c0a7ce0cf09f0d944b46e8559b74412c7"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // hack \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":"pyrefly/lib/alt/call.rs"},"region":{"startLine":2009}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b32fb6dc1eaca4affb18bcd10781e7316d42f084a70740e06436bdff0c14e2a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO(stroxler) The uses of this eventually need to be audited, but we \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fdee6facebea31e021c4c8cea06998812cc1f957e5dd43819e2eaf421e9b0e2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(samzhou19815): Support module attribute go-to-definition \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2023}}}],"partialFingerprints":{"codehealthFindingId/v1":"438a72ea572504691644f63d1a77a2ed618894c555b4bf230b40f2d050bc0932"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): it is probably possible to synthesize a forall type 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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2048}}}],"partialFingerprints":{"codehealthFindingId/v1":"80a71565d44e8681ada1f32ef7e5c82fe7a5de9243d486b535bc000fd93a0fcc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(samzhou19815): Support go-to-definition for @property applied symbols \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2057}}}],"partialFingerprints":{"codehealthFindingId/v1":"3565474a07517fdc03f22e9fd09a2982e6c8290abcd6da49b25bad7f59f6f278"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check to see which ones should have class representations \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2802}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e86ffc7456f0beef4b3af35a57ccf21b5a0cec9e6d41101efb839f0f23e2d03"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":2840}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc4a58c476932afad708a5058c6930bf133b232e4d281fa427052d1f76ef44b0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rechen): implement attribute access on \u0060type[A \u0026 B]\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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":3027}}}],"partialFingerprints":{"codehealthFindingId/v1":"2359f5cb1546e1b30f93de6966658abb2d496f1eeecc18ed8cf91fe48906a6ed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(samzhou19815): Support autocomplete for properties \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":"pyrefly/lib/alt/attr.rs"},"region":{"startLine":3461}}}],"partialFingerprints":{"codehealthFindingId/v1":"6640b9a13f2d62740112b78b991ef1e300cd5b7388fc9a39f92c8d3638b57094"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO(stroxler): while I\u0027m fairly confident that it\u0027s not a correctness bug \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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":1214}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7e1ddbd65a429b2bc3dc7664b6c31bdeacd2c4ad8557926074412cd0422cc8f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Consider panicking here once we\u0027re confident this \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":"pyrefly/lib/alt/answers_solver.rs"},"region":{"startLine":1230}}}],"partialFingerprints":{"codehealthFindingId/v1":"2642dbc79f1d2d8abf3af9c78a0305f96bc6f715cfc5a92332bd8d18d95b7625"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // There are a couple of TODO that I [zeina] would like to revisit as I figure them out. There are several types that I\u0027m not visiting (and did not visit similar ones in pyre1), \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":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c7de568ffed1e1ddad31d67ab0ab91e0aab81819305702e0fd72c77e87bc72b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// genuinely bivariant. TODO(stroxler): adopting that model requires changing \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":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fd3a6c96fb556c541b002ba07b8b648b9bcd2fbb05437f018d8b57ba91aed72"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo zeina: check if we need to check for things like __init_subclass__ \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":"pyrefly/lib/alt/class/variance_inference.rs"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"441d505f79747fb193957e685b6da42bad9a02adc6b1393ebe9bd70f22bf18e9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Look into whether we can re-wire the code so that it is not possible 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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":336}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bbc82833e32bf5653114100518e16634cccd252998df67bc131006f6f629b4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Should this be an error? An qualifier-only annotation on a typed dict field \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":"pyrefly/lib/alt/class/typed_dict.rs"},"region":{"startLine":1126}}}],"partialFingerprints":{"codehealthFindingId/v1":"f22cf3e07e18893150165db15e94491d4c5b5513bddd320336c84a629f4947d3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): There are a lot of checks, such as that \u0060Generic\u0060 only appears 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":"pyrefly/lib/alt/class/tparams.rs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df2ba4d1628e855fdacce7b78c6ec1fd49dba3925d3e72352647df3443a24b8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(grievejia): This is actually not a 100% accurate way of detecting graudal fallbacks: \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":"pyrefly/lib/alt/class/targs.rs"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"9241d61e50046a68a7033827a6a96a6fc172533d19be0a57f3face99a1c8380c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We should think about whether this is the best design. Specifically: \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":"pyrefly/lib/alt/class/pydantic.rs"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"12645b7d80a7a1d92e2e1f7b45b9dd6aed46844d642dcff14a86b690067ed22e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO(stroxler): We don\u0027t currently enforce in this function that it is \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":"pyrefly/lib/alt/class/enums.rs"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"27cef27f40139214a9bf745843fd587a3e4260fccd644dfc6d2c000226a8ee45"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: check tuple values against constructor signature \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":"pyrefly/lib/alt/class/enums.rs"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"45b74a4b3373f9ed38ddc54e130ac55467840ce5c55c0d750310ffa08d947387"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: sigs could contain unbound type parameters, because \u0060toplevel_callable_signatures\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":"pyrefly/lib/alt/class/dataclass.rs"},"region":{"startLine":953}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b901e56ee80517d5e8860895fc2576a5a5f342637131b554e1b4b4c1bb2ab08"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Zeina: This pattern is repeated a lot in this file. See if we can refactor it (BE). \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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"63d3f2ee32b3de5902ebe2b7eef0b419566ac4293ffae613e1b39bf8fac7d5f5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: a transform-derived spec silently drops the explicit \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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1558}}}],"partialFingerprints":{"codehealthFindingId/v1":"50cda9f29c0a965b55f88038be4bff25bfe667f18ce96d5b9689d547aa976dd8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: raise an error for generic classes and other forbidden types such as hashable \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":"pyrefly/lib/alt/class/class_metadata.rs"},"region":{"startLine":1889}}}],"partialFingerprints":{"codehealthFindingId/v1":"c63d0bbdd7e16f5cc9bf6d5739c6e10cb132e1dc094cc1d77672abbcfa6d34c1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): ReadWrite attributes are not actually methods but limiting access 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b587a7c8fb172b941b51571aa23bfa89c71e2292944fcf973fa4718ce77c72"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Clean this up, as we convert more of the class field logic to using enums. \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1544}}}],"partialFingerprints":{"codehealthFindingId/v1":"30f9ccebf50c5ded87811b54d94f4787cb450ce9b0077edee4ca603b25132aba"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //    won\u0027t match - see TODO below) \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1597}}}],"partialFingerprints":{"codehealthFindingId/v1":"3912aa3d66aa925785630d02d354017ea16ce5ddd67e9f2aec37647c75d91a91"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): If the child annotation is a strict subtype of 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":1599}}}],"partialFingerprints":{"codehealthFindingId/v1":"687a39e11407f9860645724b4aee9346c5b01e22db396414125559aeccfeae47"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Ideally we would implement some simple heuristics, similar 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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":2204}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f317f87e70f63a7ca36126fe9b270415031f8e10ae2996e65a702549ee91435"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should only be ignored when \u0060cls\u0060 is a dataclass \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3977}}}],"partialFingerprints":{"codehealthFindingId/v1":"983a3a6feb3db01b2a07a793c03ef04d1f3de8ae4a5c1b6d816cad327f6f229b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should only be ignored when \u0060_ignore_\u0060 is defined on enums \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3982}}}],"partialFingerprints":{"codehealthFindingId/v1":"61dbfb96228642711defa8937032025e053ce5ff04b31db52398bcc26e6cad6d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: skipping slots for now to unblock typeshed upgrade \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":3987}}}],"partialFingerprints":{"codehealthFindingId/v1":"33001b52e9bb83546427b53bdb671f157ebeeaabfc3ee85fff4749851cd1abaf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): We probably should rethink this, for many reasons: \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5276}}}],"partialFingerprints":{"codehealthFindingId/v1":"1653bb9ab6127611fa57b8159e3da238e98d41b6883960f5d483010453eaec22"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mfish33) we allow uninitialized descriptors in this case. This \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5465}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cef7c2ec930b289b717aaebb943c6e38bb6af4d2ba20987542b7c76b87bd4c7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(mfish33) we allow uninitialized descriptors in this case. This \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5867}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0d501fdf3713ecc7e15af66502773b182393b8686b0e9f30af4da6b74671fea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Investigate this case more: methods should be ReadOnly, but \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5700}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f25677e187e3a32431c2e3ba9562e47717b56b671e139a1ac40b772318a032a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Once we have more complex error traces, it would be good to pass \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":"pyrefly/lib/alt/class/class_field.rs"},"region":{"startLine":5865}}}],"partialFingerprints":{"codehealthFindingId/v1":"47e7683f1f1e49d726a7ad6536147091917b15f5169e1f98e583ab5afdcff419"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rechen): a descriptor in a TypedDict should be an error at class creation time. \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":"pyrefly/lib/alt/types/instance.rs"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"532656af8e74ea2fa4a57d2f28b7dd2e64e2a90f4c31898e5ae947aed2a94515"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO: We currently omit some classes that are in the runtime 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":"pyrefly/lib/alt/types/class_metadata.rs"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a0a7b45425bff0119e189e393790ae571966741fafa9b3a5cb4ca28b6571b8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Extend this error message to say where in the class bases the mismatch comes from \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":"pyrefly/lib/alt/types/class_metadata.rs"},"region":{"startLine":1050}}}],"partialFingerprints":{"codehealthFindingId/v1":"c388d76a4bfd247531b15a892fe026bfb3bbe77a26f4c9f3879a7cba634d616a"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // HACK HACK HACK - TypedDict instances behave very differently from instances of other \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":"pyrefly/lib/alt/types/class_bases.rs"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"aef9ebb8d798cb505895d56c7e1a7c13551f84b78e69e4e3fd0ba27b942427d8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO(stroxler): At the moment, if any actual assignments occur we will \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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4333b32c0f401c988cb08de871f3307ce3c57c1104cf12343d75819d00848d1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): this error isn\u0027t quite right but preserves existing behavior \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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef5dda60d67502da708c27634d1eed29a6ee5e6efc4004a81b63fcd881bbf163"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: semantics of import * and global var with same name \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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":564}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5b35236ffb52e2e02aef48956bff0fefe38a3eaa8d4da88d595741ba582961e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): in the \u0060is_while_true\u0060 case, empty breaks might have implications \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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":4338}}}],"partialFingerprints":{"codehealthFindingId/v1":"79a4f283303cf54580ad5e27c2568f0bd569cf3104329fb443e1b9d66f762bb3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): At the moment these are the same, but once we start eliminating \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":"pyrefly/lib/binding/scope.rs"},"region":{"startLine":4487}}}],"partialFingerprints":{"codehealthFindingId/v1":"1003b412742809c32d1ce041a9f57374a7418b73e6588acadb38a23c1e469bfb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: \u0060mode=\u0027wrap\u0027\u0060 validators also receive raw input, but they additionally receive \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":"pyrefly/lib/binding/pydantic.rs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"93856d8650585b1fab3ff504b79ca2b89ce2ca3f67ac91dc90967e868bd69d7e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider propagating the entire expression instead of the value \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":"pyrefly/lib/binding/pydantic.rs"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"6601274bc0ce6f696e8e3467262e3dffd5034dc5bb7ca7ef9da20f26178c36ed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: narrow class type vars based on pattern arguments \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":"pyrefly/lib/binding/pattern.rs"},"region":{"startLine":730}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c44e547389bd98ab6f30c70300157af99d2415e125503738110a3b73ce4f6e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(grievejia): traverse the function body and calculate the \u0060is_generator\u0060 flag, then \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":"pyrefly/lib/binding/function.rs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"edda8266905a0ec303b763b313aad0623d2bdf80cfce535839bfadf20fe10ed9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: \u0060global x\u0060 reads bypass this (they use Flow, not Anywhere). \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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"a30cdaa819abf5e2e488352c1e7c95c0e7125282762038576c7ab3eddc1600b0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): We eventually want to drop all narrows but merge values. \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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"42cf80aa8d40f1f879790c388dcfda68977059c51ae498a9b8c5951892c0a6da"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): We eventually want to drop all narrows but merge values. \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":"pyrefly/lib/binding/expr.rs"},"region":{"startLine":928}}}],"partialFingerprints":{"codehealthFindingId/v1":"f52a6ab7afcd9a225c6c287169bc98675a790f9064b628c64d5e03de673e4ee5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): This restriction seems 100% fine with experiments, I see no reason \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":"pyrefly/lib/binding/class.rs"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bd58c147e49d6e5272913fc723795936ec9f1725d54553a657c6186e75db1fb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: the following errors aren\u0027t being emitted even when enabled \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":"pyrefly/lib/binding/bindings.rs"},"region":{"startLine":838}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdb39036e77c8a20daf841928fc06bae6c67ef2f96903d182a354b69ed5efc76"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: maybe we can resolve it to see its symbol kind \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":"pyrefly/lib/binding/binding.rs"},"region":{"startLine":3068}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8ff34747c96522e9745ab06bf4e0fbb9f4b79800d7dbe84d4d9976ec2bff909"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Put these behind a flag \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":"pyrefly/lib/commands/infer.rs"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff3370681574420bd914aadb79b220f8189866e7757bda2a10d88f0dfbe0f69"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): wire in force logic \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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":1190}}}],"partialFingerprints":{"codehealthFindingId/v1":"c66e7a96bb4a2abbb683e83c255078575336cd294361d111a65d0957d5719149"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We currently make 1 unrealistic assumptions, which should be fixed in the 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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":1605}}}],"partialFingerprints":{"codehealthFindingId/v1":"94cbd51fdf299a9b3c653fec59cb3d92790ca042e3e338c2cb86e43a9b0a0b56"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Deprecate this in favor of \u0060pyrefly suppress\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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":2016}}}],"partialFingerprints":{"codehealthFindingId/v1":"39d11ef564c2dce7b01d1b1c909d33c6fb36a4d199f95079430d8281270e51e1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Deprecate this in favor of \u0060pyrefly suppress\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":"pyrefly/lib/commands/check.rs"},"region":{"startLine":2025}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dbeec96e8bd07553d50211d09566497ed179cecd5fab8fe325aa8f40a8d7fbe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This matches buck-check behavior, but still collapses the rare \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":"pyrefly/lib/commands/bazel_check.rs"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"66d301e5bd731227152c09c08906fc5be09f7cfe7a304d5e8ac6f9893567c845"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider output formatting. \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":"pyrefly/lib/error/summarize.rs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"37bebde7ca1b510bc03ba902ea70ef042bf24f227ae495c565b6c7a46cecf810"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: replace this dummy value \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":"pyrefly/lib/error/legacy.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ad200b8ce17d6e0f37b2c1f20c10854025bfa29d69f22d959c5338b2fa90531"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Map secondary_annotations to DiagnosticRelatedInformation for LSP clients. \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":"pyrefly/lib/error/error.rs"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"63ca20db580b1a34b26f47bd45e2d66365b016b1251b561afaefe3922580f8d6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): In an unpacked assignment to a name we would ideally provide the name in \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":"pyrefly/lib/error/display.rs"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d9503a2e76cec8b7ac9098f70b777be9b3e93ffbafe376f4b5611c738c48b55"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider refactoring to a named struct to improve readability of the 5 fields. \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":"pyrefly/lib/error/context.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"1905723c7fe034fb99ce1b32f54ad25baf5887f8739a220b65fdf1b5f726e991"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider refactoring to a named struct to improve readability of the 5 fields. \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":"pyrefly/lib/error/context.rs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ac993a57bf50311cb61623138ee7e8728535866726744a34e1b122c5d7f3682"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this is not a pylance setting. it should be in pyrefly settings \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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dff53a0f3e6f67015560d645aea412a39e4c1f820a411d59f184cab5901ad74"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this is not a pylance setting. it should be in pyrefly settings \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":"pyrefly/lib/lsp/non_wasm/workspace.rs"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"96777ac2b87b6e9744ed4d704930370a9806aa6dd77608a6464cf940be927330"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Per LSP spec, the server must not send progress notifications 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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"303a25fa464d948944f26fd89f287489083af476265c4f54cd72eb9990448751"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(kylei): enable semantic tokens to non-augmenting clients \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":1680}}}],"partialFingerprints":{"codehealthFindingId/v1":"f51adf7ef9ef0217d01005b27bd8c518928ae2446a3495263618dbfa9a27402d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// called when config changes (currently this is a TODO). \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":3754}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f85534df665f4d86e46bf11dc9230f334aa668ce5b661f5b94a97bd1ef0d0b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: handle more than 1 definition \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":"pyrefly/lib/lsp/non_wasm/server.rs"},"region":{"startLine":5318}}}],"partialFingerprints":{"codehealthFindingId/v1":"61fc63467dd9cbe509e197fcccc7ef24be5db681f281b8172f198d83ce98eb87"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Pass the flag correctly for whether literal string is single quoted or double quoted \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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca692c9c56b3ffe7dcc416ffa062ee50ae01dca9ccc7d25def2a14e885cbc630"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // results for now. TODO: re-enable it once we no longer have perf issues. \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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"32c26c1407d2a633b22c174f7ef98fbc3127337ba738e5d081c0c5b78a130082"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(kylei): optimization, avoid duplicate ast walkss \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":"pyrefly/lib/lsp/wasm/completion.rs"},"region":{"startLine":1340}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7410ea950f2c943353b80a1607340032327daa8f52971de8d348a4993cc9279"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(connernilsen): change things so that we return all entries that match for a given \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":"pyrefly/lib/module/finder.rs"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"98d2a776c829c559f93a034f50dbbf8c52c6c7cc12c2688e4b9180c51468fdaf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support multiple definitions \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":"pyrefly/lib/report/trace.rs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"9abd9a5b2eba94f202daa8bf927408a1eced3af7688da0cfe479b00aa89dfb00"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO(stroxler): Deduplication is by hash only, not structural equality. \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":"pyrefly/lib/report/cinderx/types.rs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bca0d717f8bd6e74c9534aa86e4a67e20fc725ec250bf021a34070eef4badb1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): These uncommon / internal types silently collapse 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":"pyrefly/lib/report/cinderx/convert.rs"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a00abbd125ec6eb590fce1e373e2e95e71a30079d1066250a1a8037c6b51f6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T225700656): Handle 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":"pyrefly/lib/report/pysa/function.rs"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1e76456476fff58b38bd4d63d22382a6b0e38fe04a9121a97427300a9a69a37"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we handled NestedClass this way for backward \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":"pyrefly/lib/report/pysa/class.rs"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"98fac46a92fc36a97a76c7bab09a8ac225bee88814966e443004edf47ada4cc6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We assume the first parameter of \u0060__new__\u0060 is the class but this may not always 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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":1329}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6ad8cffa58dc69025bc59e3b53d01fe51a9b14a129dc88dba8c678eba2b7716"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: However this is not true for example in \u0060@classmethod def make(cls): cls()\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2101}}}],"partialFingerprints":{"codehealthFindingId/v1":"d15555522ed461802eab5ebf62eeebb596cbbea04b58d510d7fb79d8fd920d47"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T243217129): Remove this to treat the callees as obscure when unresolved \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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2114}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf2b5de304d91e30c6e6e73a0a653b4598130b6ccec30c88b74201ab690d1a0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T243217129): Remove this to treat the callees as obscure when unresolved \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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2151}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bdba88475b677bc8fe7c1d652f7501e176119adec14e13756d2a52a6d7c5a25"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T252263933): Need more precise return types for \u0060__getitem__\u0060 in \u0060typed_dict.py\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":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":2596}}}],"partialFingerprints":{"codehealthFindingId/v1":"934320297573a7442f5c109eed6645802bce854745a3cf30866aa71eab0563c4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove this once pandas 2.x is no longer supported. \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":763}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e809b4ad10854a8699a636eeae10ce3201d58f4d05b563b47b08f5fe3988e28"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: consider required-ness in prepended params \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1164}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b0d2080a3373686ac45eee44c09c70f8678cbb41f90c3f450598fdb5d3f516f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): whether to add a lower"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1886}}}],"partialFingerprints":{"codehealthFindingId/v1":"c20d0fe8e2e558142ddea3096f0e53065d14bbd2797111429c66d18961e1616d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): whether to add a lower"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1897}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf711cd6c11e587e9f4a42e5cb70eff5cc31c017e9937d7cc4fcfb42c37e0e73"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Find a way to write a test that crashes if we try to assert 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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":2981}}}],"partialFingerprints":{"codehealthFindingId/v1":"0478936ca7831ca9b045366414049a4b56b5392ce477c3c8c0b8254416a8adbf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Consider adding a dedicated SubsetError for \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":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":3136}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e3ab1954dae41c560fd132500f7268aaeee0cc4538d2c1cfad251d0a6baf96c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): use \u0060SmallSet\u003CType\u003E\u0060; bounds should"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6e03549d7a046d5c66713f57c9adfd2ea55dd95617e4c0f81ed3a112b88cfa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): there are a few fishy things:"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1515}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f2067eaf02e59a2904a556c05e691c3f8c34e15bc74d2d22c8c131a8bc833ad"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): don\u0027t throw away the bound."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1647}}}],"partialFingerprints":{"codehealthFindingId/v1":"c74cbc88b378ff0cdca1d86ec8dcdaebe1fe56aa8d36fa6a82380fed41a68efb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// TODO(https://github.com/facebook/pyrefly/issues/105): the current solver design requires us"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1688}}}],"partialFingerprints":{"codehealthFindingId/v1":"25df897bec098ed9b42b39a7cbd258871773ed596718aca0f261cdb5458e295f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): consider using polarity to"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":1726}}}],"partialFingerprints":{"codehealthFindingId/v1":"320c73b5afe62cf1918ff1076cbebb4b2ee3e7908666399e9b0816aa95449203"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(rechen): replace this with specific reasons \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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":2875}}}],"partialFingerprints":{"codehealthFindingId/v1":"5079e8730196528ab07d40d1ba9e74c44e8f395d6b45a8deda48dcd5b197ffc1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO \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":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":2901}}}],"partialFingerprints":{"codehealthFindingId/v1":"67ad647a822452aceb4c061a65fabcee79d692deba478e8cadd50e6b31e0b61f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): unifying vars in this"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3738}}}],"partialFingerprints":{"codehealthFindingId/v1":"497c406ab7e6569120aec469e7e5873ffeb2f2661bacd15340bb8885a257fc5f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): figure out what to"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":3925}}}],"partialFingerprints":{"codehealthFindingId/v1":"51feeb005d7a707c09606a858d204b6569a84ce534ae30452f180600f0489133"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(https://github.com/facebook/pyrefly/issues/105): figure out"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/solver.rs"},"region":{"startLine":4118}}}],"partialFingerprints":{"codehealthFindingId/v1":"a31559bcc64b68d100c871fe8a22df0aea10b780d6bac3b7487fb9e324392193"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: It would be much nicer to identify when a module is a 3rd party dependency directly \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":"pyrefly/lib/state/state.rs"},"region":{"startLine":1727}}}],"partialFingerprints":{"codehealthFindingId/v1":"abab354a796364eb12ba19f11fc81e5d66bb2e0b6a99586853a75b9f16e072ad"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX(..., id=..., ...) \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":1163}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31db1a8409c6d7aec60a084041b29b91af97895d187c696605886c6e0614278"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle relative import (via ModuleName::new_maybe_relative) \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":1318}}}],"partialFingerprints":{"codehealthFindingId/v1":"e605b3d366f47f59ccb49627b45081e87e96b7f3fcddfa88faebd02a0342e53c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle relative import (via ModuleName::new_maybe_relative) \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2527}}}],"partialFingerprints":{"codehealthFindingId/v1":"06036e2096344f91c10b8edb0d8282311bf965ebcaf2366d609120c34fd0e61f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: If completions contain an AttrInfo matching \u0060name\u0060 but \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2151}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6e407bc6f7469b27a7f0cccc79788417ebb39388df1b760ff9cfea05867fe7e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(kylei): better solution \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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2534}}}],"partialFingerprints":{"codehealthFindingId/v1":"de384fde099c8681b0c5e410bfa267a3722ed2a79eed2f03284a52cce4f5d2ce"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(grievejia): Should we filter out unrefinable ranges 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":"pyrefly/lib/state/lsp.rs"},"region":{"startLine":2625}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f26408c6708853750756f055157028dcf649844dc1780d10c676ae316d0af3d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler) We probably should at least allow the uses that Pyright allows. \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":"pyrefly/lib/test/type_alias.rs"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"82091fcbfc3c173c06558b23282fe0eed94eb3d065af667a40ea7fd2f32145dc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(stroxler): Consider whether we could implement a false-positive-resistant approach \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":"pyrefly/lib/test/descriptors.rs"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"c71feac15a3712394c29b9fd289c1ec402d5a2788a5150c9a22e5ceb6a7d9540"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should we implement simple control-flow heuristics so \u0060C.x\u0060 is recognized 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":"pyrefly/lib/test/attributes.rs"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ca524fe552374e62f21dd82d166f43edb14327b20921b52db019bfa9744f9d3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(kylei): reference on parent method should find child method \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":"pyrefly/lib/test/lsp/local_find_refs.rs"},"region":{"startLine":426}}}],"partialFingerprints":{"codehealthFindingId/v1":"23cec91cd44749526b1dca753a1b79858925436694692adbf761da2489f7003e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(kylei): reference on child method should find parent method \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":"pyrefly/lib/test/lsp/local_find_refs.rs"},"region":{"startLine":455}}}],"partialFingerprints":{"codehealthFindingId/v1":"a026e6d58dc776aedf58e98840530e04e051170b7989affba4cea611b0fe4571"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(kylei): reference on child method should find parent \u002B other child methods \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":"pyrefly/lib/test/lsp/local_find_refs.rs"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a576c6b16bd292dbfe33b8ceec813d546113e893a54149eef158e8b13dade6b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(kylei): references on renames should find lhs of assignment \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":"pyrefly/lib/test/lsp/local_find_refs.rs"},"region":{"startLine":518}}}],"partialFingerprints":{"codehealthFindingId/v1":"d082c09dcb3358bb266366465bec6ab062510baba24f2232be5600dc8efd54d6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: /// todo(jvansch): Update test once parameter hints have locations. \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":"pyrefly/lib/test/lsp/inlay_hint.rs"},"region":{"startLine":702}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf04e64f640e2a738eda717c355db810d60460baf46c28101fe3eebe5d2baccd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(kylei): list comprehension document symbol \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":"pyrefly/lib/test/lsp/document_symbols.rs"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a74e5b51b4ca46036cf862c8cbdf1c012540d142a2d889d57c1904d89880a39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: x = 7 should be highlighted as unused \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":"pyrefly/lib/test/lsp/diagnostic.rs"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"023b07201367e3f71e49ab6ecc21048b300e44ddeb9b8e9df8f5fae2a7843297"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: property go-to-definition is unsupported \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":"pyrefly/lib/test/lsp/definition.rs"},"region":{"startLine":1721}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8d0768f2b867af55a060434ac916ff31c65c17839ad4ea3c145202b1f181d8e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(kylei): ruff\u0027s ast gives us names = [\u0022imp\u0022] for \u0060from foo imp\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":"pyrefly/lib/test/lsp/completion.rs"},"region":{"startLine":1438}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fec20381979ab36ce100728701f33bd642170e7d4b5c148a9a63ea1ca762b39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(kylei): ruff\u0027s ast gives us names = [] for \u0060from foo import \u003C\u003E\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":"pyrefly/lib/test/lsp/completion.rs"},"region":{"startLine":1479}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a3f035bbdd4be52c9bb84e3404742ab1aff77455a19bde57770524ba2179118"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo(kylei): better solution for this \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":"pyrefly/lib/test/lsp/lsp_interaction/notebook_definition.rs"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f76f5f4f04e0de9d7aab728d4b99643f2e2b4aab58313b327599ae5ddad39a13"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO - flaky on GitHub CI \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":"pyrefly/lib/test/lsp/lsp_interaction/diagnostic.rs"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f2024dc113bf6f742dcfc0df90c7284556ea8a5ab11290d8e64916548050fa3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Flaky on GitHub CI \u2014 disabled until 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":"pyrefly/lib/test/lsp/lsp_interaction/diagnostic.rs"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"e31c4c52730c66523415ffb6ee5e06ca14ccbb4a15c25c46c8420488038fd857"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: figure out why this test fails on Windows. \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":"pyrefly/lib/test/lsp/lsp_interaction/completion.rs"},"region":{"startLine":651}}}],"partialFingerprints":{"codehealthFindingId/v1":"05cd1c4ffade5d260b450f72a387297e94e98fa85fbd1c140cabdf6e5e3f2811"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T225700656): This should refer to the property getter, not the setter. \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":"pyrefly/lib/test/pysa/functions.rs"},"region":{"startLine":1831}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dd8caa6b947d57d4a9ac4103edb66164d48d4c323dded0a68218df3d3cbf8c6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Missing return 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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":1290}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3a30aeb1c6fd15a06b1c2e07b8c388973838afa740f12e9645f4e7b39e49893"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T105570363): Resolve calls with mixed function and constructors \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":2581}}}],"partialFingerprints":{"codehealthFindingId/v1":"770324842b5d0a3e774ab77d679a6e62d000b8c436f9055c2fc579f8b45932ca"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T244609756): Add the implicit calls to \u0060__getattr__\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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":2991}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6a4db1d44f4ee6b086b80ffc7d9ced2a1d2a9cef0ed78eefaaacb8ba4f9ed8d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T137969662): We should see a call to \u0060Test.__setattr__\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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":3176}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf7decf7caa48f45f7c432a20f7379d635ea0f0625f69e1cbc4d68944b4722f0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T146836847): Missing the stringify callee. \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":4291}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b0d83f1214d8b108fbba07d742d7e16efc179a2f0037e5fd3561f19e9759b33"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T112761296): Probably wrong call resolution \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":4353}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9386d1025dc40a2461f6776c14b01df37eb76bd27a083d17a0f566e300e9fd2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T112761296): Probably wrong call resolution \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":4588}}}],"partialFingerprints":{"codehealthFindingId/v1":"96c7b3b1820aa9799bc3671e1acb0a36fe89a9b56562bb3422bf391e8f4adc91"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T112761296): Wrong call resolution \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":4463}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3e9dd6fb6f22317b6ff49e7ec416c39d5da816a7ae115329fa31ce69dbb453d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle \u0060object.__class__\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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":4521}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3b63342e84f5012dff81f8b0acf681bdfa3b03785702dfc0c5e9e341daf38ae"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle union types in the receiver class \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":4744}}}],"partialFingerprints":{"codehealthFindingId/v1":"95584424d7b8277074317a160fb407c094cb8b92b235f5b2531052ac72115ffe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T225700656): Handle \u0060super\u0060 calls to stub class \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":4996}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8e71437396c6697adf7bcab2bc16bcbe7a065ae5758761000e8c936dcba4f46"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T118125320): Return type is None, which is incorrect \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":5196}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe5e7c2ef02c3644bce7d5600d92bf72b5657ecc931b85e1e10db2804199764a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Receiver class should be \u0060test.D\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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":5832}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe42c0a562505f98de6db4a16129b39fcbf59c8d0286b233b0eac23aa04c378"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T252248020): Resolve \u0060__setitem__\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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":7117}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d9d79699f9324d5732161a9b538b77fee2beb812c50c9ee347ccc98a48a3156"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO(T253219415): Resolve \u0060__init__\u0060 call. \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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":7391}}}],"partialFingerprints":{"codehealthFindingId/v1":"c460a69d26aa298d934a8ac2fc4088bfa3d98ad1d1bb7bd06c27c0169d57fd14"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should be Overrides with receiver_class test.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":"pyrefly/lib/test/pysa/call_graph.rs"},"region":{"startLine":7998}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc0275f635e2acb0f527cd5d361f556c383eaa4113b442c67c4ae7b00809f1b2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: should be TypeKind::Union (the element type). For now we \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":"pyrefly/lib/test/tsp/tsp_interaction/get_type_queries.rs"},"region":{"startLine":1880}}}],"partialFingerprints":{"codehealthFindingId/v1":"154d61d64b0544e1befda7ba83ca4cf6667f5f6d7207a8afb0734eaba1384ab1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: the plugin here is a little involved and might only work on linux \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":"scripts/projects.py"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c395293a6e7464201ef98be7a839ce95f0ca270efafdece1b7fef556659a8db"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Infer the result shape from the statically shaped blocks. \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":"tensor-shapes/pyrefly-jax-stubs/test/test_structural.py"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"72745920e790974e165c1e2765fd6e53109dd869d2e6a938736a16227595b679"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Infer the result from literal contraction dimensions. \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":"tensor-shapes/pyrefly-jax-stubs/test/test_lax.py"},"region":{"startLine":854}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aff7300a0c1dd7e050a3117ad875511c1188a9ad17fcdf92ce1a5aff9d8a6d8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve shapes inferred through map and scan callbacks. \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":"tensor-shapes/pyrefly-jax-stubs/test/test_lax.py"},"region":{"startLine":1007}}}],"partialFingerprints":{"codehealthFindingId/v1":"47ddf2d58e3972098c1e3151a0884e480c113708d7e4efe25f25d5295f9c684f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve the common branch return shape when operands are supplied. \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":"tensor-shapes/pyrefly-jax-stubs/test/test_lax.py"},"region":{"startLine":1017}}}],"partialFingerprints":{"codehealthFindingId/v1":"25d58919c472f2de4d24370daea6156fcffaab04ce517f33d1361d6a5502bfc7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve callable shape information through \u0060composite\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":"tensor-shapes/pyrefly-jax-stubs/test/test_lax.py"},"region":{"startLine":1251}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f28defbd3ca404da33a8156f51236cbc363081352167237fd6e9991dfc051b2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(stroxler): Preserve the length of list-literal indices in annotations. \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":"tensor-shapes/pyrefly-jax-stubs/test/test_indexing.py"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef9c9ca6baaeff7a1f9292c5b60c938ab6080663d1bfaa87e545347d4b8fd0c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Infer the result length for statically sized edits. \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":"tensor-shapes/pyrefly-jax-stubs/test/test_indexing.py"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d616edc667eec8d5b47fc17bf1611c05350100610703d85b0d5a507e6700b85"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Infer concatenated shapes from statically shaped operands. \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":"tensor-shapes/pyrefly-jax-stubs/test/test_indexing.py"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7a850d5d942467d50833e69925082d7b84d2e4cea33c80efd994057f6435b19"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: Remove this annotation once literal arithmetic preserves its result \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":"tensor-shapes/pyrefly-numpy-stubs/examples/physical_science.py"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"c122a624e70cca96d55b038a5302dde060ebaf343e3abff45d7cf0d06bc7d36c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(stroxler): Preserve more precision when broadcasting against unknown shapes. \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":"tensor-shapes/pyrefly-numpy-stubs/test/test_math_ufuncs.py"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fa3615ae03be1a13a8852bd94c3e7cdc605b734c6698abdae711f1940de57a3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(stroxler): Preserve a list literal\u0027s length without storing syntax in Index. \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":"tensor-shapes/pyrefly-numpy-stubs/test/test_indexing.py"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"e91df98ad54519e2f6edc7b991f67bffffc7c7de3c4593a12aadf9f81feb2c6f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: MAYBE BUG: Since \u0060IntTuple\u0060 is itself gradual, the solver could \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":"tensor-shapes/pyrefly-numpy-stubs/test/test_creation_basics.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b797c8e78be72d4010bd6f613be2b8a3322a67c8daa071ebb26d6ced2c568c6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(stroxler): Unquote \u0060typing.TypeIs\u0060 when Python 3.13\u002B is the minimum version. \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":"tensor-shapes/pyrefly-shape-extensions/shape_extensions/dsl.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3d507b4a43d8431f52957d4c761131b8333e4ef92d13c2d37f8933ec550042b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(stroxler): Check the Torch stubs too. The package predates stub \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":"tensor-shapes/pyrefly-torch-stubs/run_pyrefly.py"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"682c1944020988fa7bd101a46ad388127a6252df3980e8d79d0de0d811d44ae0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # not 100% sure what this is, so far seems to be harmless. TODO investigate \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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"28c44c605a4899986b59199bd2ebe4db8f99112a0432d54f08d417133b716323"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # not 100% sure what this is, so far seems to be harmless. TODO investigate \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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"8816657b5c618ca786edef10d0dd7c7da10a0e8e160674e7c481caa4636fbfcd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # not 100% sure what this is, so far seems to be harmless. TODO investigate \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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a73bc605bf1952f4b18968dd4e83a0298e0e6416bbae3d9110b3256c5ccb99a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # not 100% sure what this is, so far seems to be harmless. TODO investigate \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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d0bbc37762e5d832cce5c74e07f9c7106dbf9aadc078b22bc758d187ec6ecc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # not 100% sure what this is, so far seems to be harmless. TODO investigate \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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d88d6c310563563fc36802793de8d640d8c1309630e097d6b9c541fe53c6aed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(rechen): the type of \u0060n_params\u0060 used to be inferred as \u0060Unknown\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":"tensor-shapes/pyrefly-torch-stubs/examples/nanogpt.py"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"69ad99f09b3b67fc3810146d6b7ad9fb4f59e0cea80a5114c73d2bbdde3f7735"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(rechen): the type of \u0060n_params\u0060 used to be inferred as \u0060Unknown\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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var_runnable.py"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c39624aace856d55e8645c7aa2301aade67ade3abe02e03c740119d470be71"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(rechen): the type of \u0060n_params\u0060 used to be inferred as \u0060Unknown\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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_sym_int_var.py"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9da70181e9745aefb50da343134215b40abde95fef76dffa31d2d5f7544964c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(rechen): the type of \u0060n_params\u0060 used to be inferred as \u0060Unknown\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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations_runnable.py"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"4874db09f60b94d606ff9b6bd6c16d1ef986c5d19c6c8447a936a5a59c182ef7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO(rechen): the type of \u0060n_params\u0060 used to be inferred as \u0060Unknown\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":"tensor-shapes/pyrefly-torch-stubs/examples/runtime/nanogpt_future_annotations.py"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"a080f6f5794d7fc39f389868de1a3470a868dace680498d0bf86ce0eb0847655"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject an empty variadic argument list statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_repeat_expand.py"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"16b0496c47f15dc056f54059f926e20ad7ada394c8e30f674cd9351e84549491"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Torch rejects explicit dimensions for scalar inputs at runtime. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_repeat_expand.py"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"f44af949768167dec3a1b3113484c65acddcceb450a61563392ed052d9b831a0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject an empty repeat argument list statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_repeat_expand.py"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"8919b66fcaae3a854f0508431b4a6a5fcc935e2dcbc95166412a224bad1212c6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve partially known shapes through tuple unpacking. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_repeat_expand.py"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45c38b9a5f23882f27b9b3de2a4b3a37a1228f1b720cfc82066e9cafdd77226"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Add a shape-aware overlay for \u0060torch.special\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":"tensor-shapes/pyrefly-torch-stubs/test/test_public_submodules.py"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f44b9febb9aeb79a10e5d1325f57bf5fb83f7de765b051c3b895efcfffbec4e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Accept singleton pooling tuples as repeated per-axis controls. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_pooling.py"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"b44fe0039d022358132e799f19ce3fa275d2f5d848f1ec09c5b77448d9c5ba56"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Runtime requires \u0060dims\u0060, even for a scalar tensor. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_permute.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b83f6b50c534bc73cde06d144be65f79f970cb488fa13577e2389fd7b269025a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject \u0060value\u0060 for non-constant padding modes statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_padding.py"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"619078d0f65c7223cb23acce5f8cfc99d3af7dc6fac28358bff13ea81cd848f4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject out-of-range sort dimensions statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_ordering.py"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3ca6a228976b336e9691588f25b071397f39d02079fd5f8fc5076c7d7dfa224"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject non-positive kthvalue indices statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_ordering.py"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"d04b347910b080c4b1999d497d3832d3062acb99908e4e79ca17da0bd073972d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject kthvalue indices larger than the dimension statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_ordering.py"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d3a727e3d47a07e264306c6a171b2e6a1743d525af148f55bacd055e042fc19"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject incompatible \u0060dist\u0060 input shapes statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_norms.py"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"528db219cce6b2104cb2d819d9a88012a118b6ce61d11955725216c55ceee5ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject masks that cannot broadcast to the input. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_masked_select.py"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0276fb1bc4279dd6b14c94f534902e5416e6898615a0dabdf88f2dc0c6ba6f5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: In-place masked_scatter cannot expand the input shape. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_masked_scatter.py"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"75b54f1106ea048305ed75e6c568a532dd363f3200b57539fba607288d4c67a9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: In-place masked_fill cannot expand the input shape. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_masked_fill.py"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef6deaec98b0fee7d5243b15acacf875e97d250182ac3a63703ad980eed46066"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Accept any tensor with exactly one element, regardless of rank. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_item.py"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"2637c6d5b296f1285a9a1c6ba70bfc162399a86d442dd507d02fca8bb25822a4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve shape for tuple-valued scale factors. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_interpolate.py"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f17e67248431c72931a867a1f40686152848209c0d8541c741806fb0495e11f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve output sizes through \u0060nn.Upsample\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":"tensor-shapes/pyrefly-torch-stubs/test/test_interpolate.py"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"869da75810f879a0cbe7c79ef219f93425d209e3945cb408164131579f4a1fc6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject out-of-bounds literal indices statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_indexing.py"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"e31b9b7224aa57a393f17756941002c8fb34d72620e821acba4a94c7e5d477d6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject more index tensors than input dimensions statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_index_put.py"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dd50059b079bcb929abce04238c4a0dd661fa3c1dd6851cfb70052ce56e6ac8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Index tensor shapes must broadcast together. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_index_put.py"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6e7343ffa19d9ee73cf39cd98fe23c0aa74741d3c1e860d32a109c19b29de56"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Values must broadcast to the indexed result shape. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_index_put.py"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f8cc0dc29a4ed9c1fde58aec9213c2340bd87412b79f7d8473117d63d3cb05c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject nonpositive complex FFT lengths statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_fft.py"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2ada0baa95f5a785adb484fd114e47840265d513a9e2dbb0dc04ed9c673628b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject nonpositive real FFT lengths statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_fft.py"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"4af7018e906ce6308d45d78b0475eccd46532b760bce97831ac3fe7ac588b997"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve known axes for optional transform lengths. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_fft.py"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"e639408fe334eae11676bc5315054ef36766f78ef16bff8a1694f597805c7d17"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve literal transform sizes rather than returning gradual. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_fft.py"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d572d51abf9414f88085dad364f9981f26d52ab9e6e280277041caf67f57c5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve literal transform sizes rather than returning gradual. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_fft.py"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"2248663b741f0461937175013aad76b62e3899544d1a538138baa0ddff054ef1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Validate multidimensional FFT axes and lengths statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_fft.py"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eaa5150f124aebafe84df080849dbd651b603ae732685f3f95c3e5fae4da626"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve literal real multidimensional FFT sizes statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_fft.py"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"873da2791b31e95ff184a70e73b5b34dad6739e2dc24ad244155c12b4e9fd738"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Validate FFT shift dimensions statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_fft.py"},"region":{"startLine":241}}}],"partialFingerprints":{"codehealthFindingId/v1":"e337cfef7ce847fd48c2f1fd742ae7de318fb74704d922537a37a7ae155a8d4f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject out-of-range cumulative dimensions statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_cumulative.py"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dfb6dd6eb4c4e21fbf2a3efb1f3015f35a8c470c5a6512007df6b54524d2058"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject out-of-range cumulative dimensions statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_cumulative.py"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fd7a0175a443c7bd37a3a945c1b638c5d59c34c177bf94a340db82dce17cd0c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Reject negative literal dimensions statically. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_creation.py"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"26622904062de14957042065f8440ab8e23034fdc59f43098cec1f0a6ee4237d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Track per-axis convolution kernel sizes. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_convolution.py"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"16ca48bd876de65394c24b5037020afe3bcc8123f535e467a6e613bf98e799db"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Track per-axis convolution controls instead of using scalar defaults. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_convolution.py"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5347334777bf3e4c370e515837790ea35430dd7dacae5c42f2e1d8058fb0f8e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Model string padding instead of using the scalar default. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_convolution.py"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eb52cc9a1766b9dee3b1e6aae9ad16753d4044111bb5fb447627ef60b49a7ae"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Accept singleton convolution control tuples. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_convolution.py"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2e35d05c5ec7499d306e178dfd0f9d0112a577bc479174b0c522c59419a6f15"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: A known reduction should produce a scalar for unknown rank. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_classification_losses.py"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"79e350d55257e4094b927cf0f4850b319c379357d070ec1b560e2b7f0d129ec5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: # TODO: BUG: Preserve the broadcast shape of tensor indices. \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":"tensor-shapes/pyrefly-torch-stubs/test/test_advanced_indexing.py"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff12040d452e2faf9b4f03c4ea00147546c244b810f872099897a653a1a5e5d4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (T222948083) Re-enable internal sandbox after we fix issues with sandbox on static 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":"website/docusaurus.config.ts"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dbe3e001e8b7161194341d8c0cf0f756fb908223dbaa90bfdc78e434c92fbf2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (T222948083) Re-enable internal sandbox after we fix issues with sandbox on static 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":"website/src/pages/sandbox.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"91335879a48bc28f892fef2a78721c28043f6d9364144d0c6ce8f7e842421940"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (T222936871): Add data for pandas and pytorch after we publish Pyrefly and get it to a stable state \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":"website/src/components/landing-page/PerformanceComparisonChart.tsx"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"65ca8aa27a3dc0ac6d1c5d6bbd2ef0f59083a4114b3f59774fa6f2536b4a055c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO (T217247871): expose full error message from Pyrefly binary and use it directly here instead of duplicating the logic \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":"website/src/sandbox/SandboxResults.tsx"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c1602eb23f88816f875f8f5d7589d71b6ba29b2962d5b0270c4f4f8b539a958"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D22","level":"warning","message":{"text":"Redundant methods with unclear distinction. \u0060override_config\u0060 and \u0060override_config_at\u0060 have nearly identical signatures and return types. It is unclear why one requires a \u0060project_root\u0060 and the other does not, or if they represent different scoping contexts that should be unified via a single method with an optional or explicit scope parameter.: Unify into a single method \u0060override_config(config: ConfigFile, scope: Option\u003CPath\u003E)\u0060 or determine if one is obsolete and remove it. (signatures: pyrefly_config.args.ConfigOverrideArgs.override_config(config: ConfigFile): (ArcId\u003CConfigFile\u003E, Vec\u003CConfigError\u003E) | pyrefly_config.args.ConfigOverrideArgs.override_config_at(config: ConfigFile, project_root: Path): (ArcId\u003CConfigFile\u003E, Vec\u003CConfigError\u003E))"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4a6c58a3e1b2684cd2b69e6918feba40fe58784f3e47ff70142bbd6e68d8e408"}},{"ruleId":"D22","level":"warning","message":{"text":"Duplicate method signatures. Two methods named \u0060get_env_from_interpreter\u0060 exist with identical parameter types. The underscore in the second parameter name (\u0060_interpreter\u0060) suggests one might be a placeholder or deprecated, but both are exposed in the public API surface.: Remove the duplicate signature. If one is deprecated, mark it as such or remove it entirely. If they differ in implementation details not visible in the signature, rename one to reflect the difference (e.g., \u0060get_env_from_interpreter_cached\u0060). (signatures: pyrefly_config.environment.environment.PythonEnvironment.get_env_from_interpreter(interpreter: Path): Result | pyrefly_config.environment.environment.PythonEnvironment.get_env_from_interpreter(_interpreter: Path): Result)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"912e967a0284c898411535fadf17a5fc90e761af32081bfb7cfbc6ff8612a24d"}},{"ruleId":"D22","level":"warning","message":{"text":"Ambiguous overlap in intent. \u0060includes\u0060 returns \u0060Globs\u0060 for a scope, while \u0060get_filtered_globs\u0060 returns \u0060FilteredGlobs\u0060 and takes \u0060custom_excludes\u0060. It is unclear if \u0060includes\u0060 is a simplified version of \u0060get_filtered_globs\u0060 with no custom excludes, or if they serve distinct filtering logic. The naming convention (\u0060includes\u0060 vs \u0060get_filtered_globs\u0060) is inconsistent.: Unify under a single naming convention. If \u0060includes\u0060 is just \u0060get_filtered_globs\u0060 with empty excludes, rename \u0060includes\u0060 to \u0060get_includes\u0060 or merge logic into \u0060get_filtered_globs\u0060. (signatures: pyrefly_config.config.ConfigFile.includes(scope: ConfigScope): Globs | pyrefly_config.config.ConfigFile.get_filtered_globs(custom_excludes: Globs, scope: ConfigScope): FilteredGlobs)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"87666c96eb160edc0be100a09a36850e543de7742c460cd1843197cecd72019a"}},{"ruleId":"D26","level":"note","message":{"text":"Split pyrefly: The repository root is already the single large project; its children are under it and not splitable. Suggested: "},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"fbc9957544440321dd61ffbefa46474bb2a1887518c4c8b72281c1cd286f3a3f"}},{"ruleId":"D28","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":"12724a776be06a5bdc5ee5ce2427ec7031c3902e98e937b6e45d38030abc1d53"},"properties":{"commitSha":"2588564a5a1f0691ac0363c2038a61040bea3344"}},{"ruleId":"D28","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":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"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":"9bdcba30567184768ef0eca393f649d9286e5aefdc5b00761bd8e51e1c96b362"},"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":"01f8e0620ec722dfa365776f9806aa49acda035308fd60fa6ec1847530148042"},"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":"be31c1f7b8bd0aae8c7150e2c1f5f15071ee116ad517c48e7fbb3a683af9e0ba"},"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":"9fd0f0f7c4c3e1dac8c11e1bf40bd778ba7713874b9aba964d6ede27afbc1bd5"},"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":"b2c849fccf1f6585876d7bcac10bb32d8b878058ecaf0d8874472dd6b7e81bcf"},"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":"702d922dcbe904c70c323ac2e62ad5a12ac2e6d8b6e2d338db5252ef004b9c2b"},"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":"3184f97478038352074edfe5608be4879eececc91692f2b9df69190ecd7b183c"},"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":"e919e26c778201d786a0e42048e6ce035862a2cf829874c6acd85ee705407315"},"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":"825e4d344dc40146585b920d1608ecad1f3977412ea17fb77d0af826a5f43cb7"},"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":"b931d4e4294c2708fa1af810e7e7a27aea84d5cb1cd0866ba06c26ed7df4c80e"},"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":"79e9053b0a81c63978780a1b3b29b985b307f18bb93dc8ba1a4da3eccad8f0c2"},"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":"66aa9d7bf2e4e58f67c9814fb0367af5e905f7ea524fb6a2f8306707b0fa1da4"},"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":"08ae4bff2b3ed36968e56caf1d9faf06a65d10a5738a15c1ea734455f1eb79a2"},"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":"abaa1583f864d3a553dcbb29fd88e0855e2fcd45051893d3b3eb9fc805867c61"},"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":"6665373dcfac0a6ad9365579320b914e484bcbc238129526c662b31177ab1e22"},"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":"52d9d2411ffdfedcb35c0bd0e55f461fec7b91c106a1f18c61c3a70de06141fa"},"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":"ba66433e434473d299b85fe2f61e9cd568a543aa1649cefb210dd69158d7005b"},"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":"faf41d1c8e3b09c20ab9c419840725f50641d9a78de2af3ee26eb9a294ab9eee"},"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":"5e3005ecef2019355ae71026adf5da9e339adfc474ba5c7c4c8438f8b4b9057a"},"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":"5b435d1c9e474d0699a8c4912f743d6a7d9ccc1fa0f85059b1f50a79c4177256"},"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":"01e57a6adb25e1efea4bdbed92c0731d12ae44e84f190b0e6df3dfab087fcc73"},"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":"4185b1ce909ae905fb401c6eccfe847a19a42e6609339bbe8d1f27f874beaac4"},"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":"cb63cadd0e6b7179550fa3d22f64de9d49686e4b71bb7b8f2018005c4f9de432"},"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":"fcd41060cf4330c74e7ed2bbc7cfcf39113b414e31057d1910b0994e5d36eb75"},"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":"0d8d0d9d2beddc11ff4d53ccd17bba27550818a2280ea48a6b63e041ce6ad11e"},"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":"fab04e0395a927b97938de09509ae5eece993afe2dc51b24e1d3085db19fd93f"},"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":"e8abbc50126a5bc3abfa9183b1338188364408b08c193052b4f35ee7d154cd66"},"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":"691f0add76983f206517f7c9fa82b7a87c959f5f0f05dc17abaae3dfe009623b"},"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":"5dc160f889800e77f37a7411ec1b63ef5bc7bebd09b125ccdbc285ea2afde0ac"},"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":"fd5e3657a9310733f26c45aa35bee34ebc1a6589e0a037cfa58070a54b68b391"},"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":"c5a97747ff717ad60025e780079a4601bab408eafce8aa9a47c43c1ce2d65767"},"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":"515ff4a7af71038b13570099749ecefce0753a17aed116c6cf715ecfc1b4428b"},"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":"419004d81cfafa693d1f72c42e0184097d5dff31ec287837ccbaec2e47755661"},"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":"149194b18b2e7060f57bdcc6b1050d54bc50a97edfc19b1021ec7b30d4cc0e35"},"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":"485bb5224b88c0bad8a7ae8c051d9bfaf8faa9eb0c12527b7c841072ff0d0ee1"},"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":"53ecc787ab8f95a6ed622601297dbccd55e71f84e9755472838fa2c280e9c649"},"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":"c192ab444eb41c45afe7675764179a8e58e5ac3e07dea95d9e50e68326be431c"},"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":"4a45a3811c350e61693146a07b9ff49c9b5a43a3b9e0bf6005d723976ad6c840"},"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":"be23d8ea666e3b5047e3d39b7beceaf47e2d0dd088c4a1fbd24e568f08fadf48"},"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":"cad7464075ecdc16aa5a5c310a73875c169efc1017a3be4d01e4c8452968e29a"},"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":"f95d7ac4ff0cae9329c41eda9a103dffeaf9bd79b0814ff8e6aef8d4f4348a96"},"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":"50c5289e8e4777da69e39bc7615cf3d55f7c5a5aa72212340477b70417a9db17"},"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":"2882bf8232aeb4d2c6d746d83726f00e23689322f306dfb570d233ef19488da8"},"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":"2fb2627ee92c262ab95b3eb6e601d5c2c2603bae4f70f75676113ed009b164c3"},"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":"8b4c1df12f33454c0f3a0f1234ea6d4b323fbd3b8e1434e9b4d879ca045f8df2"},"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":"16f0bad4ce1f78c172455d7110d93b0ca118112d8408d6a12f17f572b7ffb165"},"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":"b40765261880abcb9c47185ed3ffab8cc2ab96f5b533a5fded8c789116569f6d"},"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":"0ae37735debda18234925d27036f6a928bc5cc41ef1282a8e5b5dd641a38cc40"},"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":"cad35b3bd39b8a14490f7f5bcba87e0f2fb15179d5ac3be532e42171eac01451"},"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":"404501da3fe43fe9143108189ac270e30d041a7be0595a6977ad915025a25ad2"},"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":"db08de3a8dec5303c29a6ac4abce9abfc0fbdb553359ac7d7aca843fbb999460"},"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":"17e8f45f7f89679e31da211115475364a640c6bfbef65aaa649bd7bc153f2590"},"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":"14ca78f827620d20908bb3c49c883fbba09a2cd4b66b450a52c5a7de814f9c69"},"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":"b51c19b86dee89f7ee18095a4eb48220f2df88f6559f1aeacfba74e29e15b161"},"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":"14b23c7e786550b004f4607f3c99f6ac6f36f0f5eae46cd5da49b4e695f29f05"},"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":"00e3b037fad006be685c0044ea8d2acabeccfe1cfe55440950839fe84cf0746e"},"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":"31f31477e440693d54118e38a069bae97ee2bf07dddedb41df1c46093be0ab8e"},"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":"8846deba28ce9baae37f13af950f74edd150641183a0b2cb45aeb2a8f11e03f4"},"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":"2e195b19bb84117307946330ad13827272627822128a4adb0dc92839abdc161a"},"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":"757714af8191c9a2365059e8f3e8e832711ff14bdbc67d547e715c50fbf2437a"},"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":"f55b46d427938b8714c6c13db4b8d8b82b80267c9afed216d0f118956fd62752"},"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":"91a6ac4b30b4b37f615fd12dd9783e7eddba6961a2a2ce509e5261dec8db77a1"},"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":"98c7760057ab524407f670dfcf01638f9d9e73eb087e7d6e7601306792e9d020"},"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":"0787c66735d47ef6a49e4165e1dc165a0ac55c9ca5e7dcdb10b4a94fb31f0ff8"},"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":"db03c1f4c26011e3cbb25e392368e80c7fc920717722fde7dc8cf5b1a608b284"},"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":"bd6af65b4a90cae043ef50cc155f842bad58b556a6600d5d9760dd66ff53f22a"},"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":"cd1833fecfe31fd4268fe40c7d4a42ed2cec675bb4ab6e9d288101a1e53fa1e5"},"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":"36f50e9c6e89bc30dc3421b7102181688c4ecbbbf3f08dbba677a583f8328c70"},"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":"33ac11c2039c8a0de09593a972db4cebe7dfb0d22ef26d52191ce15baae1c661"},"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":"da73b384b2d9abafab238461b435860bb31bc4a337fc2e2f9f24431153c09be4"},"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":"53d4cc126d7e1405a77a98d4da1f6bb64319ca4ec0baee10dd109a1c0218c717"},"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":"41e8050f3271164dbde265deb373827409aeef9c6cbbd1e600a8c388fcec5e95"},"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":"a5c8053f90f40825d3087c76eb3e99804f3b367f43f1d5babf765b45bcdc233a"},"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":"8fe8fd381b7533303c4e9a78254dfd23e2966cebc61d94668e9f7e6d6c681770"},"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":"dc44da4f6d13f39b71270d7f82abd9c401368405f2693f98df1b7d246dbf010f"},"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":"b66869a57ef89b14655297d225bf39e1bc83149666d6c88c283bef7ece6de3ae"},"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":"a89bc19963e48162bdc19d314d2c54d116ec6b42f6e3e046b91e5472cc8dec30"},"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":"6bd9a8e6ab8e80d6192377c4ebb17e8e67dadcb7a8f32f42484fb9bda7def3b4"},"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":"43f18009f4339c7828f0f5361b98954a8aa15482c38170d396562c468cb11f70"},"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":"a17e886177c026b0f4cb96bc0362aad672c76468e6780c5acacf4c935932d3b9"},"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":"8d783f73b248055ac5370bbfbbcfdefe880f084907dd251270e17a1dcc6081c5"},"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":"77eb720b91c8b6def613ed0ca148461eec84a9d009bdbfe99673b384596da117"},"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":"2fd0b95c3e7ff626b8add255fde15ecb32a495cfcfd9a805623b0aac29ccda5f"},"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":"f3e09c3d1ac4b62f0ce0684ac6f8e62115c3fd9cba690644260c351df1f08776"},"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":"186460fb186e0012f6b48093cf23e96807ab5e09946e3d06eb9e1a19d1fad299"},"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":"1801184126241b9c31cd221cfa04774327f3da74beee32c05d3b131d80b5ec35"},"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":"d0cacdcd4d7456f6715ac14389b7f958c6296c3246264c33ed044b4795b7d3b0"},"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":"655188097d363da6bdcfc03f34a11cc582bd5aa9bf896d51b39d7c00bfa9c2f1"},"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":"a27682432ef7169c1b29de9bb328b2b9ed24aafdb658407ae3c46d629c8307fa"},"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":"08022661fb66c44c0e902dafff125ee131ec6c814e48f580ac74f3ac5ad55ac7"},"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":"ca8fa58798b70afd88138efd95ed6483204e5ffba16efbaf0f085aafb39c7c6a"},"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":"0afab526f63daebaa42a0ae78ca1746ba46816d901115bb1d783a9b98e04ebd1"},"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":"3dfe86827b1c6b365dac222d9e10b1a105037ca879f893f7b7dd3d69c28306cb"},"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":"b5d37833c469e40a1c87a378f0431319929e906dd13b96e4a40d65516fc15fed"},"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":"03ce84652ea0414026b65bef3762cac93c0b2425971b95e671345ef1493f1ba5"},"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":"1b008a0de033b96f7ced83b431034cb05a4f83916414ca9e20dd2527fd373733"},"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":"3443dcce22436f2228c4a9cb5c683cfc1dc340234222f617d041d68596450f9c"},"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":"6ff7e34c6206a1f7e2552488c1bb18db9493ea083732c8335a7eb50aeb760a0c"},"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":"3a3844ba74db39e62dfa3aa4794824c2f559b50e385e57916fb83b3e48e9575b"},"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":"dbf760232c9eda1379629db99e55ecafa4e46dded9c5e35d204bfb9314bbc231"},"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":"4dcf15684c9bf990ba47ab82414bc25e7c04093c5e67a164c4c60805008f0a79"},"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":"8f6f81bb078492712a1d5eb4eea9eada2709c5e993395bcddf5e5cf70e6504bc"},"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":"0eacce86e0279023d0287cc9e94c1bc32f243c5d6775427b788059fc7385d7a6"},"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":"f384edd1d77582a5089bce30553720275fd6f44e84e51d7508f4916c40667a42"},"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":"59facf8d4ce556aebadd2a059e93dbd9256c3ab2361fd38bd6ffa6b8d7f0b1eb"},"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":"3ecfce0e46573fbbd3ec175fe0cd06629772863e0e93ee08418a3a9326a514da"},"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":"30e25c9687d7c306621bac245ca037a0e76b3b704e35e09e006d3ea37a4953c0"},"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":"dfef190a34ff191d46f069c44d89f528f2500331a9f9ebb323b18c86c00af093"},"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":"434c0b5f6166c6fc11c219a29623cd506b7d6f0910492c5e521382dda109fc8d"},"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":"6be31e056cb0769b821e739f8b4546eb96560f52a39ca11a04d08344dc693e90"},"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":"afeae143879f591816da97332347cac594eb9cd200b16c4a0b54ebb69d1845b2"},"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":"43905a2cc2800f2c2aaf0411ed588247972b54c6f73fb5ffaa0a3324370ae951"},"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":"93e6c3acaa25ced84b74939e2767fa90e44aab2493024138311324519a80963e"},"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":"e9a711c0ae3fa4336c365bec455268242fc9ab24a0a196ae55e6206851415989"},"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":"d900a92a5f9d45b954eff7a54ee83a57398f3e5c6c90bebb7cbe097ab8724d0e"},"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":"3dc2d103b1b18ec1df511afbffe2c8b5a54ad324c273d0e0415dec77d705457e"},"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":"b9c1ec87194423a1197bec30818ec38ff784789c94439a3e75534adcdbc3a084"},"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":"34d681947e005eaaad0ae60465485c5124afdabba5efe423b3ab49cb3c4454f7"},"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":"535e4e4318651a20fa486c9ee92696703ddceb806d8765b3c1e0f2fbee7f72ef"},"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":"0b77f085ae54b76073a43395987a471666a3b52a5310c39397dbb36cd10256dd"},"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":"9d90c997cab5afe9d68bb2c7e4954719504d7c5d7d3f2a408bdabe2420120a58"},"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":"f0ab8a1c584b83bd03097c803fd2784fa42a8cc6918408da7e5f94598ea670e1"},"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":"56e351c7b195309bb3d17933fca4015429e649a1b49aa38ef0a590675377f911"},"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":"ec81142ffbc54aee74a2602f769bfe3a4d83d8eccca2088a5580acbe211c7e92"},"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":"6a101f0c56b6c5d3bb2de65e390e55fc496dbab95a67029e836517d295efe69a"},"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":"51e1bcfd386cc75a2b05081862051a9e06071715e64e4aae3411593f6e00b8ec"},"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":"bb868fcbab1d3e668feeab5ecccbe4979af6fd489e25542e1fa46f2ab45a0a02"},"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":"c7219cf4d01ccead7acd1dc9ffa7f1b0222f1f7cfcdcf748eb3a5ca9c9343382"},"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":"bc227b8b3b43b14ce3447467e32822789db2df925928c137846146ea94379d28"},"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":"656336bc9e95a3e817c67ba33d0cc8970dd82b1e4d589d2cf4fe12cd623b15ba"},"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":"47b61096589bbbdd33bd4be6c9876254c1566c077c6453f5d2109875be0a1b32"},"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":"b2d551e88459aed4f6731660fdf1504807745bac249ba7ce9c8c9848053ac120"},"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":"02936eb64bd54b8691bbe5831f0826c971b0fd1d85810eb1cb6d9d1c7d25c35d"},"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":"d9a975ad564764ed54b8c06d629042afd230079aebf1f4330142146f708a992b"},"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":"cfd9232a1741fac97739900b2d5fb2bc77d55f5d967276bc3ce689f44651b41f"},"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":"25ec41db092b090939d9bf108896c7c53ab94d5773cb0a80bacdaa39ae085486"},"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":"5aaadac1a5eb72e25c139a3736d55927fb640d774fdbacd0d9862d602571b277"},"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":"b0be9fb3c63bc569030dc76d941f0aa641be0081c5991b3c2e272234ea457c85"},"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":"576ca813350f3f6a7e51cd6db2ce098116e497136544787bc873042e77dc1ec9"},"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":"997dcbc60a7f2764e5f03f1515f30b55e542d3d751e034e65f7d793e776bf3d2"},"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":"d1b76d08038750f90e8137aae5de56f487a4c1c277c6c82c8c46611d4a2ba832"},"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":"6a2e70f5a335eb200b20891c7ea848ce209c16d267156ba8e8d2cf476c40224d"},"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":"ab8d83539c5ebe567cb6deae98d392d6617f9ea4001a34a9a21fb3f393c0be8f"},"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":"2012caae9e83ea5de03b622aa05670e98eba1e84d2bd4bf2917027bc16c328b1"},"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":"95398392b2ac36e0a5c059e4564f9faf49ccc4af7c909f92f5fc436513a1b4d5"},"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":"0a11d251338434b90c85c77099578336711c72f86f915cd3dcb97e1d3ac1f411"},"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":"a7d8aa4484d016de6a00362162557dda80dddb560196fa4c2fc4742a9eb8efe4"},"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":"a5492d0dcfcde9c80441b3cd7ba1d22fd692b3111145c27703a5d88a8b914b50"},"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":"5d2bf3d2d7b39c2a046189f80ddef234edbf81ff261cf0db3c2130fce66f569c"},"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":"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":"16ed28b5f1b61ba0fd219c2ca643b86876930a0dd61ee99e1e87218364bbeff5"},"taxa":[{"id":"CWE-125","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","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":"52f53c85f681c4f989181ded5ef8207cdee7cbf9667158b7e41baee913531e09"},"taxa":[{"id":"CWE-939","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":"2721f7dd8ad9e882a2053aaa39881f2dd7d84b2dc88ad1d7b4389aec41ff0919"},"properties":{"dependency":{"package":"linkify-it","version":"3.0.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"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":"e64b9cf975bb8ed072e796319dd842045a0c785cd56c58793fd3c1284d4cb087"},"properties":{"dependency":{"package":"shell-quote","version":"1.8.4","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"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":"8a4a49d80fd6a05a6ce11222d52e21202933afa340a9aa52bd568a33704041fc"},"properties":{"dependency":{"package":"glob","version":"10.4.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"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":"1580b59eede2d578582be166bb338943113e9509e19680729037c87d6df870c2"},"properties":{"dependency":{"package":"serialize-javascript","version":"6.0.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[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":"aa275dcc581e31816223ff250817b0083925776ca9db8bc9a83879cc85b97f8d"},"properties":{"dependency":{"package":"derivative","version":"2.2.0","advisory":"RUSTSEC-2024-0388","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":"5922a5beeab5ac077ffb485a783ad545036e79b56239f83da38f3fb84336b113"},"properties":{"dependency":{"package":"paste","version":"1.0.15","advisory":"RUSTSEC-2024-0436","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":"a42ca7416279f52063a649dbc505340ffc7c7a5727193e601ae1de8d6db75e3d"},"properties":{"dependency":{"package":"fxhash","version":"0.2.1","advisory":"RUSTSEC-2025-0057","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":"f98a5252cf643899a128d2b6f6d04b7713273d44fa70b088ba81df0a39c759a9"},"properties":{"dependency":{"package":"faster-hex","version":"0.6.1","advisory":"RUSTSEC-2026-0306","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":"f01982a897b707a7a860ec0c57c83187aeca77214f1799a88dd59ff8c1232818"},"properties":{"dependency":{"package":"markdown-it","version":"12.3.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"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":"74b26f3916bd6a30538bed51a3fb054f099a975c096b99544990c7204a646761"},"properties":{"dependency":{"package":"xml2js","version":"0.4.23","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","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":"296b660fedda3524078aa456dcaee7444fd0408d7963a1b08565794ccb87bc0d"},"properties":{"dependency":{"package":"diff","version":"5.2.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned files with no living knowledge: 15 of 407 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; 407 of the 520 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: scripts/primer_classifier/cross_checker.py, scripts/issue_ranker/passes/rank.py, scripts/issue_ranker/github_issues.py, scripts/issue_ranker/report_formatter.py, scripts/primer_classifier/code_fetcher.py, scripts/issue_ranker/issue_checker.py, scripts/issue_ranker/status_classifier.py, scripts/issue_ranker/pipeline.py (and 7 more). 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":"warning","message":{"text":"Change coupling: traits.rs \u2194 table.rs: \u0060pyrefly/lib/alt/traits.rs\u0060 and \u0060pyrefly/lib/binding/table.rs\u0060 change together 100% of the time (11 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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 11 shared commits counted here, the most recent 3 are \u006019eb5f49\u0060 Add per-module Django relationship summaries; \u00604ebb45d0\u0060 Add KeyClassDisjointBase scaffolding; \u006024eb9c3e\u0060 Merge class-level diagnostic check bindings \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/alt/traits.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e45c4ca2cab04f77ae0025d897ba6fee86c4182801d0ce97ed8fae91b94cd623"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: binding_memory.rs \u2192 class_metadata.rs, solve.rs, class_metadata.rs: \u0060pyrefly/lib/report/binding_memory.rs\u0060 changes together with 3 other files \u2014 \u0060pyrefly/lib/alt/class/class_metadata.rs\u0060, \u0060pyrefly/lib/alt/solve.rs\u0060, \u0060pyrefly/lib/alt/types/class_metadata.rs\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/report/binding_memory.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a055f62ceaabb153f25889196a3f106121b9617a4df678130aabf21596b5430"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: buck_check.rs \u2194 map_db.rs: \u0060crates/pyrefly_build/src/source_db/buck_check.rs\u0060 and \u0060crates/pyrefly_build/src/source_db/map_db.rs\u0060 change together 92% of the time (24 of the 26 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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 24 shared commits counted here, the most recent 3 are \u0060b5aaf8c2\u0060 Split module enumeration from source DBs; \u00607ecb606d\u0060 Split live/incremental source DB methods; \u0060d5331bb3\u0060 Avoid per-origin \u0060shape_extensions\u0060 misses \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/pyrefly_build/src/source_db/buck_check.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf4252e3959402facafdd62105bd02f8263f2e2f8a67ba8142965f2bb41e2f04"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: subset.rs \u2194 type_order.rs: \u0060pyrefly/lib/solver/subset.rs\u0060 and \u0060pyrefly/lib/solver/type_order.rs\u0060 change together 78% of the time (21 of the 27 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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 21 shared commits counted here, the most recent 3 are \u0060647610b5\u0060 Guard against recursive protocol member checking in __getattr__ self \u2026; \u0060ee9a4f85\u0060 fix enum.Flag unions incorrectly do not match typing.self in (class)m\u2026; \u00605a29260f\u0060 Simplify \u0060constructor_to_callable\u0060 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/solver/subset.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"607fbe6bced634a9137bf90283850c6e37466e4f1c3546ff25ad772371a6cfd3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: query_source_db.rs \u2192 buck.rs, buck_check.rs, map_db.rs: \u0060crates/pyrefly_build/src/source_db/query_source_db.rs\u0060 changes together with 3 other files \u2014 \u0060crates/pyrefly_build/src/query/buck.rs\u0060, \u0060crates/pyrefly_build/src/source_db/buck_check.rs\u0060, \u0060crates/pyrefly_build/src/source_db/map_db.rs\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/pyrefly_build/src/source_db/query_source_db.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"da78c3c21ccbec7fc61c77f50bfeccffc2ef9d0c773471fc57026733a12efa90"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: call_graph.rs \u2194 override_graph.rs: \u0060pyrefly/lib/report/pysa/call_graph.rs\u0060 and \u0060pyrefly/lib/report/pysa/override_graph.rs\u0060 change together 68% of the time (13 of the 19 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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 13 shared commits counted here, the most recent 3 are \u0060d3abc3d9\u0060 Borrow read-only solver helper inputs; \u00602ef9d847\u0060 Remove override graph building in pyrefly; \u00604f7937c3\u0060 Back out \u0022Revert D93807796: [pyrefly] add opt-in telemetry to ad_hoc_\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/report/pysa/call_graph.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4184fb0307c8dbad1043f70343fc58cb63fa7543d59999455c863db92c70b1ed"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: solve.rs \u2194 ide.rs: \u0060pyrefly/lib/alt/solve.rs\u0060 and \u0060pyrefly/lib/state/ide.rs\u0060 change together 56% of the time (24 of the 43 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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 24 shared commits counted here, the most recent 3 are \u0060c0ac8823\u0060 Compact binding storage; \u0060d461a1ce\u0060 Detect illegal legacy type parameter shadowing; \u0060df1f1ba1\u0060 Chain module-keyed \u0060PossibleLegacyTParam\u0060 bindings \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/alt/solve.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea754fc1274484d3c58f1b4c703971158f73938d60f75f0f0e67958093ef0989"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: type_table.rs \u2194 convert.rs: \u0060pyrefly/lib/query/type_table.rs\u0060 and \u0060pyrefly/lib/report/cinderx/convert.rs\u0060 change together 55% of the time (11 of the 20 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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 11 shared commits counted here, the most recent 3 are \u0060e916f286\u0060 Delete the CallableResidual type; \u0060702f0d12\u0060 Add Type::Overloaded; \u006047ef3b51\u0060 Add plumbing for literal-capturing Flag-bound type vars \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pyrefly/lib/query/type_table.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1066099f14401daa6ff8a8788acc80e46e84afb80cd7d714227c6d995aa62da0"}},{"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":"fe274ba5adebde25ca0b3db842e44cbb1aaeb7cfecfbb7215cd452596ba1f4c2"}},{"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":"ace515990e7ee0f17b5c17e44dd168a5bdecf90804a3a3dd845cf05540978013"}},{"ruleId":"AX9","level":"error","message":{"text":"Query writes persistent state on the read path: ConfigFile.get_paths_to_watch: \u0060ConfigFile.get_paths_to_watch\u0060 is a read-named query yet it performs a durable write on the read path (a persist to a store/repository). A query must stay side-effect-free so reads are safe to retry, cache, and route to a read replica; move the write into a command."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1419}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8e13c845b77f71c5c370d819a086816afde545dc389e849d2b12d90dbe5dc00"}},{"ruleId":"AX9","level":"error","message":{"text":"Query writes persistent state on the read path: ConfigFile.query_source_db: \u0060ConfigFile.query_source_db\u0060 is a read-named query yet it performs a durable write on the read path (a persist to a store/repository). A query must stay side-effect-free so reads are safe to retry, cache, and route to a read replica; move the write into a command."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/pyrefly_config/src/config.rs"},"region":{"startLine":1470}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2df8d44f8793012eff02c64eb0c12674e9d94f95c9c0995cbacd86adb12fc40"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 5/10 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060pyrefly\u0060, \u0060tensor-shapes/pyrefly-einops-stubs\u0060, \u0060tensor-shapes/pyrefly-jax-stubs\u0060, \u0060tensor-shapes/pyrefly-numpy-stubs\u0060, \u0060tensor-shapes/pyrefly-torch-stubs\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (19 matched lines \u00D7 2 locations): lsp/src/extension.ts:141 \u00B7 lsp/src/extension.ts:409 \u2014 the two spans are one implementation copied and then locally edited \u2014 91 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/extension.ts"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ae5abc48c30a6e07e521de9c8f2b920055d7fc929eeeb8c43d7c84957685b2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (16 matched lines \u00D7 2 locations): lsp/src/code-lens.ts:219 \u00B7 lsp/src/code-lens.ts:246 \u2014 the two spans are one implementation copied and then locally edited \u2014 62 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/code-lens.ts"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"8168084793911d8f4dbe5b56f0390db9ad705fa9aa534d7e4fccbdda9d6cb567"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): lsp/src/code-lens.ts:53 \u00B7 lsp/src/code-lens.ts:64 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/code-lens.ts"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"be46d4d48adec5349bc5279e9547d4be26834e36e6fac08a9202d9407fc87b89"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function runTestAtLocation (cyclomatic 14, cognitive 17): runTestAtLocation has cyclomatic complexity 14 and cognitive complexity 17; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/code-lens.ts"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c1469a66f4efc8416c0db091be89569a942317f736a68c7a16f94eca3e9b40f"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function updateStatusBar (cyclomatic 13, cognitive 13): updateStatusBar has cyclomatic complexity 13 and cognitive complexity 13; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/status-bar.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"2407adbd70064ed29dbada8814e1adb416fc2c045ab41bf5e733c43726c348f1"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function selectBinary (cyclomatic 11, cognitive 11): selectBinary has cyclomatic complexity 11 and cognitive complexity 11; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/lsp-path.ts"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"d915ad054faa442153e18488ebd4f26522629f6e8b5e4facf2d41f8132fc0fe4"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 1 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: lsp/src/extension.ts (534)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cecee31b569df4f07e06db732f1ca037af27b5afef9023da51f9673d931a142f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/esbuild.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b8766bf1e701f50893347f90a8b7c936ebcce87fc58a794c4da2a8c102a3dfe"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/build-pyrefly.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1028055841a35b507c0bf523f71220ffd7a255c5e73ce1c765245296dddcbb81"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027requireSetting\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"lsp/src/lsp-path.ts"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ebf1dc094ebecc53475cf43a4c6a722edd7187074de91d171afc9498cb860a"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027@vscode/test-electron\u0027: Declared in lsp/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4a15d50c22f15a825eb0b3a3f453eb30e52b32d979c7cc56d65d625d4b1c686d"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027serialize-javascript\u0027: Declared in lsp/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6b48feb39322dac7ef17db8bcf065101f08c1cd1a76c05d8310682beb48ace3a"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027underscore\u0027: Declared in lsp/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"87b0daff323858a079935a193bc18812feb15ff12bc52db2d9ac26429be17a80"}}],"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-125","guid":"98717707-96bf-ca5b-9568-8d1d257574c1","name":"CWE-125","shortDescription":{"text":"CWE-125"},"helpUri":"https://cwe.mitre.org/data/definitions/125.html"},{"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-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-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-939","guid":"12397742-f2c4-8254-8012-482c3356c551","name":"CWE-939","shortDescription":{"text":"CWE-939"},"helpUri":"https://cwe.mitre.org/data/definitions/939.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":170,"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."]}]}