{"$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":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"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"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"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":"D25","name":"ADR Conformance","shortDescription":{"text":"ADR Conformance"},"helpUri":"https://codehealth.canine.dev/dimensions/D25"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"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"]},{"target":{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"],"owasp":"A05:2025"}},{"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"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"],"owasp":"A03:2025"}},{"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"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"],"owasp":"A03:2025"}},{"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"]},{"target":{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"],"owasp":"A08:2025"}},{"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":"AX6","name":"Interface segregation","shortDescription":{"text":"Interface segregation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX6"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"GD1","name":"Unfinished \u0026 placeholder code","shortDescription":{"text":"Unfinished \u0026 placeholder code"},"helpUri":"https://codehealth.canine.dev/dimensions/GD1"},{"id":"IC1","name":"Incompleteness \u0026 stubs","shortDescription":{"text":"Incompleteness \u0026 stubs"},"helpUri":"https://codehealth.canine.dev/dimensions/IC1"},{"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":"PF2","name":"Allocation hygiene","shortDescription":{"text":"Allocation hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF2"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X27","name":"Collection changed while being enumerated","shortDescription":{"text":"Collection changed while being enumerated"},"helpUri":"https://codehealth.canine.dev/dimensions/X27"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X4","name":"Structured logging","shortDescription":{"text":"Structured logging"},"helpUri":"https://codehealth.canine.dev/dimensions/X4"},{"id":"X5","name":"Nullable reference types","shortDescription":{"text":"Nullable reference types"},"helpUri":"https://codehealth.canine.dev/dimensions/X5"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X7","name":"Silent fallback defaults","shortDescription":{"text":"Silent fallback defaults"},"helpUri":"https://codehealth.canine.dev/dimensions/X7"},{"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":"Matchless.fromLetRaw (cyclomatic 570): Matchless.fromLetRaw has cyclomatic complexity 570 (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 file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":5400}}}],"partialFingerprints":{"codehealthFindingId/v1":"097de266b884c8de4f56f3ab3626cf1f18b288a1e0a637d23861c2006dfdf4a7"}},{"ruleId":"D1","level":"warning","message":{"text":"Command.opts (cyclomatic 284): Command.opts has cyclomatic complexity 284 (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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"85cf85207f9b9cdbbae062b8c3369639b84e554b51951ca9457e9f56c0480bf6"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprNormalization.normalizeLetOpt (cyclomatic 130): TypedExprNormalization.normalizeLetOpt has cyclomatic complexity 130 (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1526}}}],"partialFingerprints":{"codehealthFindingId/v1":"9df26d222087ecd0ca4c2587f29a76614717bb582d74168fb621acb669bed1d5"}},{"ruleId":"D1","level":"warning","message":{"text":"SourceConverter.fromDecl (cyclomatic 118): SourceConverter.fromDecl has cyclomatic complexity 118 (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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"01a1941042f29afa638409d0784f8cda9266aeda4b7c2c551be8b5b96acfa55e"}},{"ruleId":"D1","level":"warning","message":{"text":"SeqPattern.seqPatternSetOps (cyclomatic 117): SeqPattern.seqPatternSetOps has cyclomatic complexity 117 (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":"core/src/main/scala/dev/bosatsu/pattern/SeqPattern.scala"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2ad68e67107023fb51cbd134d62300e8d8de92bff8c37261a0084ef3fb01879"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.simplifyKnownConditions (cyclomatic 95): Matchless.simplifyKnownConditions has cyclomatic complexity 95 (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 file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":3053}}}],"partialFingerprints":{"codehealthFindingId/v1":"38e9bb55b93968d835a01e29c23b713cd7b3622dae908b5f4a2c19bf1844e036"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.reuseConstructors (cyclomatic 92): Matchless.reuseConstructors has cyclomatic complexity 92 (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 file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":2249}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67b21efc497fa3100041727864821139a480d1e4c20c5b5a222a5c571343dbd"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeErrorIn.message (cyclomatic 92): TypeErrorIn.message has cyclomatic complexity 92 (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":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"91fe3b6ed90c8b2e20a6f8140ea28431fecec8cea61ea0c5e26c6dca55461ef0"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueToJson.toValue (cyclomatic 90): ValueToJson.toValue has cyclomatic complexity 90 (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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":695}}}],"partialFingerprints":{"codehealthFindingId/v1":"78e3daa1255023d319e9d2e24cff15a71c29364feae84b84d6dc04d5d0785dbc"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueToJson.toJson (cyclomatic 88): ValueToJson.toJson 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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef60bd6aeab3b048a6b44496453b002e5458381ba028d7c2a9c172d0b02d890d"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.typeCheckRho (cyclomatic 75): Impl.typeCheckRho has cyclomatic complexity 75 (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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2289}}}],"partialFingerprints":{"codehealthFindingId/v1":"78909ae373fd488e4a688558a76460c037bbbeaf65005003925e977754c8a4eb"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.maybeEvalMatch (cyclomatic 72): Impl.maybeEvalMatch has cyclomatic complexity 72 (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2893}}}],"partialFingerprints":{"codehealthFindingId/v1":"91b210de048dafacae77c9509eedca41d32b802d18d014500feb1428ee536683"}},{"ruleId":"D1","level":"warning","message":{"text":"MatchlessGlobalInlining.rewriteExpr (cyclomatic 71): MatchlessGlobalInlining.rewriteExpr has cyclomatic complexity 71 (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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"c20066ba1e08208dec501a10d4f1f096eb0f6c1cf4cc2127cce305c19139dec8"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprNormalization.shareImmutableValues (cyclomatic 69): TypedExprNormalization.shareImmutableValues has cyclomatic complexity 69 (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"391edff3103a58367392457e0973cee7084128d1e19f42d0f4bd0c0426784922"}},{"ruleId":"D1","level":"warning","message":{"text":"ExprOps.basicNorm (cyclomatic 68): ExprOps.basicNorm has cyclomatic complexity 68 (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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2d0cad4b54ccf056f54c5611203903e856be77ff15a36a2cf3f3c506f9228a0"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.inlineApplyArgs (cyclomatic 59): Matchless.inlineApplyArgs has cyclomatic complexity 59 (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 file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1428}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5b09d841984eedb528c7a8434f917ead16982f77109d90a2e9806f2e1790978"}},{"ruleId":"D1","level":"warning","message":{"text":"Declaration.substitute (cyclomatic 58): Declaration.substitute has cyclomatic complexity 58 (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":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":569}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1e206cc60f02dc8f35291b8bfcc50c56b8290474b56b541b1988f25d2a677d0"}},{"ruleId":"D1","level":"warning","message":{"text":"Code.toDoc (cyclomatic 58): Code.toDoc has cyclomatic complexity 58 (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":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2558fde93a5b49ab570fc1f5e762eaa549ca50f4a47384c050f9f226c7491c3"}},{"ruleId":"D1","level":"warning","message":{"text":"Ops.loop (cyclomatic 56): Ops.loop has cyclomatic complexity 56 (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":"core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala"},"region":{"startLine":3623}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a584bc3da9eb6a5205bcbde8e2b140752ef48f3f3ca36e11701bc4e041abfb6"}},{"ruleId":"D1","level":"warning","message":{"text":"ProtoConverter.packagesFromProto (cyclomatic 55): ProtoConverter.packagesFromProto has cyclomatic complexity 55 (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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":2219}}}],"partialFingerprints":{"codehealthFindingId/v1":"3634a97fe10ff63d120dc21e463be69ebf2ee492553714583f3b0b5e4b4e1154"}},{"ruleId":"D1","level":"warning","message":{"text":"Op.simplify (cyclomatic 55): Op.simplify has cyclomatic complexity 55 (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":"core/src/main/scala/dev/bosatsu/codegen/python/Code.scala"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"d57d0ec91266ba9c909a04960ed9e846d3c1ad0470233134fad3ccda5fa41642"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprLoopRecurLowering.rewriteGroupedSelfCalls (cyclomatic 53): TypedExprLoopRecurLowering.rewriteGroupedSelfCalls has cyclomatic complexity 53 (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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"185cee7ba415c7617841c89f0f6e1947899a8d04404a58062a740d2ed0f3edf2"}},{"ruleId":"D1","level":"warning","message":{"text":"ValueToDoc.toDoc (cyclomatic 51): ValueToDoc.toDoc has cyclomatic complexity 51 (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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bce21632ee71561f9c70789d3ebdcb578870798c1564ed95a9873ce7210d7ea"}},{"ruleId":"D1","level":"warning","message":{"text":"Env.impl (cyclomatic 50): Env.impl has cyclomatic complexity 50 (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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":1279}}}],"partialFingerprints":{"codehealthFindingId/v1":"83a25479c2ece3786b06d695eed12835bcd5d5888d00931ab573966631e555c7"}},{"ruleId":"D1","level":"warning","message":{"text":"Pattern.patternOrdering (cyclomatic 49): Pattern.patternOrdering has cyclomatic complexity 49 (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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":1028}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a0b8c8d2001c0e0480726d511065d5a15c9201cdf7be9182ac9b594acdac204"}},{"ruleId":"D1","level":"warning","message":{"text":"Type.instantiate (cyclomatic 49): Type.instantiate has cyclomatic complexity 49 (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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f864f196ec61db5cbebc8b3b516c1975ef7b5a569b364892442f175e7f5eae"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.unConstMult (cyclomatic 48): Expr.unConstMult 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"43a2f6fb80cbda4b3ab3d50e7cfed20260cf16b68d5252d58bc8d1142adcb170"}},{"ruleId":"D1","level":"warning","message":{"text":"Declaration.toDoc (cyclomatic 47): Declaration.toDoc 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":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"1235bf74eee34d845cf7c94b8b73afd0dd01179287d649fd4c6e0b449d3e441a"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExpr.eqTypedExpr (cyclomatic 47): TypedExpr.eqTypedExpr has cyclomatic complexity 47 (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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"946fa7c1567eb82adb36191ac4e92d46dc8d32d8ef655b17e78e8c306573d693"}},{"ruleId":"D1","level":"warning","message":{"text":"Env.innerToValue (cyclomatic 47): Env.innerToValue 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"279017aa7b4b0652dd169e12a9a06851beb9a8ee0f81eb5fd7bf1ada11b10443"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeValidator.validateTypeConnections (cyclomatic 46): TypeValidator.validateTypeConnections has cyclomatic complexity 46 (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":"core/src/main/scala/dev/bosatsu/TypeValidator.scala"},"region":{"startLine":687}}}],"partialFingerprints":{"codehealthFindingId/v1":"90ae4ab23fcde54c4040c02d1fee1c4cf9e509cf713f28b361b7dbf05150712a"}},{"ruleId":"D1","level":"warning","message":{"text":"Ops.boolExpr (cyclomatic 46): Ops.boolExpr has cyclomatic complexity 46 (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":"core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala"},"region":{"startLine":3308}}}],"partialFingerprints":{"codehealthFindingId/v1":"80339213bbb34cd8ee5f05b6d2ac034dd96f114c1d0c29bc2a2c263ca5e533a2"}},{"ruleId":"D1","level":"warning","message":{"text":"Command.opts (cyclomatic 46): Command.opts has cyclomatic complexity 46 (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":"core/src/main/scala/dev/bosatsu/cruntime/Command.scala"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c2d9d102d66ac287463aabdd9d42719d3925601d2d8e78afef70a234664cddb"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.subsCheckRho2 (cyclomatic 46): Impl.subsCheckRho2 has cyclomatic complexity 46 (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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":976}}}],"partialFingerprints":{"codehealthFindingId/v1":"9574390aaf92ebc55d592ba7d4cf15dca86d10dd5dbe1441c80d11c33526d66e"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.typeCheckPattern (cyclomatic 45): Impl.typeCheckPattern has cyclomatic complexity 45 (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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2881}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b4d622ff6dc2d0cad8d09d828d3ac90e22e5e1f2b87707619d634b14100e39b"}},{"ruleId":"D1","level":"warning","message":{"text":"IntAlgebraic.optimize (cyclomatic 44): IntAlgebraic.optimize has cyclomatic complexity 44 (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":3269}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f586eeaa2086268dc582b35cac19d80be20e37dedbe226b5695dc3ca0cfb81f"}},{"ruleId":"D1","level":"warning","message":{"text":"ShowEdn.decodeTypedExpr (cyclomatic 44): ShowEdn.decodeTypedExpr has cyclomatic complexity 44 (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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"15d4115c5a7baaad564a14ca2140d3860aa5e1abc3339c94ff0993a6a744538e"}},{"ruleId":"D1","level":"warning","message":{"text":"MemoryMain.memoryPlatformIO (cyclomatic 42): MemoryMain.memoryPlatformIO has cyclomatic complexity 42 (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":"core/src/main/scala/dev/bosatsu/MemoryMain.scala"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"98855296f4643a5c1f4cd783d10865fd92ec620ef39779d00283ad17e9289eb5"}},{"ruleId":"D1","level":"warning","message":{"text":"Env.boolToValue (cyclomatic 42): Env.boolToValue has cyclomatic complexity 42 (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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eaafafc741f3a317f1dcbe075ab06aae1ad10fd1e8b4541c3afe91b82a7c1cd"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprNormalization.prependArgsToFnCalls (cyclomatic 40): TypedExprNormalization.prependArgsToFnCalls 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1249}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2b8ab8a807e8ef2c6196334249aeba4f3ccb1464b2fe4997b8a365fcdb00c9b"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.parameterDemandSummary (cyclomatic 38): Matchless.parameterDemandSummary 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1848}}}],"partialFingerprints":{"codehealthFindingId/v1":"65b6e4de2686745ce4701ecfea122c7648d9b3eb934dd4d7f7e2cc17e455c907"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.readsMutable (cyclomatic 38): Expr.readsMutable 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"4859f5f520153c0fe8e8ffda6755364371cc2fd8345c4b6f24b65657ba991247"}},{"ruleId":"D1","level":"warning","message":{"text":"Env.loop (cyclomatic 38): Env.loop 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":"core/src/main/scala/dev/bosatsu/MatchlessToValue.scala"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"539aadb8b1109064b109a5ff22b07ce96480463100bd7e51752cb755595bc24c"}},{"ruleId":"D1","level":"warning","message":{"text":"Output.report (cyclomatic 38): Output.report 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":"core/src/main/scala/dev/bosatsu/tool/Output.scala"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0b93f7b592a9f8264ec78f9e873a90362daef5d7310806fe52005d03b9faf53"}},{"ruleId":"D1","level":"warning","message":{"text":"ProtoConverter.buildExprs (cyclomatic 37): ProtoConverter.buildExprs 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6be2591230b0aa3315c19fe769ffc396891588cb38c826dc59cbbdd4f57dfe0"}},{"ruleId":"D1","level":"warning","message":{"text":"InvariantTypedExpr.freeTyVars (cyclomatic 37): InvariantTypedExpr.freeTyVars 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2156}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fd7427bc027333b1483eeb18ebae4e9d94c6eeee1cad544e038f7610ecccc8b"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.sinkBranchOnlyLets (cyclomatic 36): Matchless.sinkBranchOnlyLets 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":2909}}}],"partialFingerprints":{"codehealthFindingId/v1":"f57b3ff3d6d039c5d491e3f828e49a14c0a94ed6846b9fbccca33625eea892c2"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.containsWhileExpr (cyclomatic 36): Expr.containsWhileExpr 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"d244525da6b831b4c1b1727f72cfa0cfe0d07b2dbba9114b47888592b4781411"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExpr.stackTraverseExpr (cyclomatic 36): TypedExpr.stackTraverseExpr 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":1759}}}],"partialFingerprints":{"codehealthFindingId/v1":"2065273e5f313c4939e3c6cae423d7c47e65c9512756286d96ae6d17da2d8221"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.checkExpr (cyclomatic 36): Impl.checkExpr 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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":3519}}}],"partialFingerprints":{"codehealthFindingId/v1":"67e0551ca422ecd722e76154bd142145a6239ac913a22e764bfa6bf1cac8bf98"}},{"ruleId":"D1","level":"warning","message":{"text":"ShowEdn.decodePattern (cyclomatic 36): ShowEdn.decodePattern has cyclomatic complexity 36 (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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb4370b414f922d71bccdcba9c8dcc63b6b614effd5857eb01ec067b79bdf3cc"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.substituteBindables (cyclomatic 35): Matchless.substituteBindables 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1130}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d3339914560fd00bf29c352ae9cba39c727101b2df4dbb9182aaf3f47f33910"}},{"ruleId":"D1","level":"warning","message":{"text":"Solver.unifyShape (cyclomatic 35): Solver.unifyShape 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":"core/src/main/scala/dev/bosatsu/Shape.scala"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bfe2e298f1aaeb5ec98f81f8f2ae124638a394c10ce3ca2c154cfa96430edc5"}},{"ruleId":"D1","level":"warning","message":{"text":"CheckBenchmarkMain.parseArgs (cyclomatic 34): CheckBenchmarkMain.parseArgs 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":"cli/src/main/scala/dev/bosatsu/CheckBenchmarkMain.scala"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"78aaf93f595389ad08812d14243c936b3f92573e1ace6ba0d3d8453f77e4356c"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.refreshAnonBinders (cyclomatic 34): Matchless.refreshAnonBinders 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":825}}}],"partialFingerprints":{"codehealthFindingId/v1":"a50e3ce331332de7daad854f76343e9bd824182f96da1c1d63a953876c483479"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.referencesBindable (cyclomatic 34): Expr.referencesBindable has cyclomatic complexity 34 (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 file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bf1c55f965554d68465142a9378d6b9ca7e1b7fc3cc639ece433e29e7c9c2c2"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExpr.quantify (cyclomatic 34): TypedExpr.quantify 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2640}}}],"partialFingerprints":{"codehealthFindingId/v1":"847be8051d08eb60d859fbf08614b90ab45a52c7aa9468d3a7276d61df5e58b9"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprLoopRecurLowering.rewriteTailCalls (cyclomatic 34): TypedExprLoopRecurLowering.rewriteTailCalls has cyclomatic complexity 34 (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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cacb9bc001c56dfb14a822e5a8d8eeb8169671913a54dd2c6b0cfe444b1462e"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprNormalization.dropOuterRecurArgs (cyclomatic 34): TypedExprNormalization.dropOuterRecurArgs has cyclomatic complexity 34 (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":965}}}],"partialFingerprints":{"codehealthFindingId/v1":"68bf728a64e034b18849b540c2655dd88f78eb4ded4b72ddaa5c7e3aebef9225"}},{"ruleId":"D1","level":"warning","message":{"text":"ApiDiff.apply (cyclomatic 34): ApiDiff.apply 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":"core/src/main/scala/dev/bosatsu/library/ApiDiff.scala"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ad7f128f591d9d52835ae43e7729c69f926931623d4f8b29bd42ef40f47edef"}},{"ruleId":"D1","level":"warning","message":{"text":"Analyzer.checkPattern (cyclomatic 33): Analyzer.checkPattern 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":"core/src/main/scala/dev/bosatsu/Inhabitedness.scala"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"3860f652905c04128f7a4e3235b2f160fe5cb02fdec5608076136a673ba8ead0"}},{"ruleId":"D1","level":"warning","message":{"text":"LibConfig.validatePacks (cyclomatic 33): LibConfig.validatePacks 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":"core/src/main/scala/dev/bosatsu/library/LibConfig.scala"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"528ccc6278713ded233ca3294ff3cc5fbd7bdf98cd2ac4a732aca69c3644bf39"}},{"ruleId":"D1","level":"warning","message":{"text":"SeqPart.part1SetOps (cyclomatic 33): SeqPart.part1SetOps has cyclomatic complexity 33 (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":"core/src/main/scala/dev/bosatsu/pattern/SeqPart.scala"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9a0c3dae3d0863f8252687c3c4cb5c3b0b8580ade122441586ac63dc9cf03e"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.referencesLocalAnon (cyclomatic 32): Expr.referencesLocalAnon 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7d8cc5c6d1df94bf9fde5afee9d576b7ff90fa05c20b9f1481826e2f16234ff"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprLoopRecurLowering.isMonomorphicRecursiveBinding (cyclomatic 32): TypedExprLoopRecurLowering.isMonomorphicRecursiveBinding has cyclomatic complexity 32 (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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1159c01a758016f4f3b7b7a910a0df91ee9f4880edfb4ff4e18d5cc1f2094f9"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprNormalization.hasEscapingFnRef (cyclomatic 32): TypedExprNormalization.hasEscapingFnRef has cyclomatic complexity 32 (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1185}}}],"partialFingerprints":{"codehealthFindingId/v1":"f44b95d595df5e3dc4c95c19a0c411fc9c64b749e63d615968088ecd67f52325"}},{"ruleId":"D1","level":"warning","message":{"text":"InlineBenefitModel.shouldInlineCall (cyclomatic 31): InlineBenefitModel.shouldInlineCall 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":"core/src/main/scala/dev/bosatsu/InlineBenefitModel.scala"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"68fa22f88daf3d5d6b29424efcf575f448b34cfef379f9ce26ed45dac57b7091"}},{"ruleId":"D1","level":"warning","message":{"text":"Pattern.document (cyclomatic 31): Pattern.document has cyclomatic complexity 31 (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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":1117}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2edd54ef590c076d44535e3b65c475477916626b72e8f58f8ce678c1d26c7dd"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExpr.replaceVarType (cyclomatic 31): TypedExpr.replaceVarType 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3951}}}],"partialFingerprints":{"codehealthFindingId/v1":"4285d43ec1174fbaea5f9275fb6d760a163312d8bd18af57493169ba622a05d3"}},{"ruleId":"D1","level":"warning","message":{"text":"UnusedLetCheck.loop (cyclomatic 31): UnusedLetCheck.loop has cyclomatic complexity 31 (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":"core/src/main/scala/dev/bosatsu/UnusedLetCheck.scala"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"64d7efc34ed4c29b23f89306a34b475b687182c8773928cd877d2a58d3f55f17"}},{"ruleId":"D1","level":"warning","message":{"text":"JsonCommand.opts (cyclomatic 31): JsonCommand.opts has cyclomatic complexity 31 (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":"core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"58d5543fbf679119a03479489680c6581614b65b2f0cf01c056edf309fdf896a"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.allLocalAnonIds (cyclomatic 30): Matchless.allLocalAnonIds has cyclomatic complexity 30 (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 file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"c24f5dfd9fa8a6a28aaae2c7c305a5de8113480b6e2aa13814ee6fddd060bdaa"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.hoistInvariantLoopLets (cyclomatic 30): Matchless.hoistInvariantLoopLets has cyclomatic complexity 30 (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 file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":2763}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a987926f4bb176fd250a0ba969ac1181e8e4d579481adf678d97c29f3aaa950"}},{"ruleId":"D1","level":"warning","message":{"text":"MatchlessGlobalInlining.freeMutableAnonIds (cyclomatic 29): MatchlessGlobalInlining.freeMutableAnonIds has cyclomatic complexity 29 (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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b921ac2f31e4f3cfe9287eff1968dd1fce01acd18c23467595cdbd67ca257f"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprLoopRecurLowering.lowerExpr (cyclomatic 29): TypedExprLoopRecurLowering.lowerExpr 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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":879}}}],"partialFingerprints":{"codehealthFindingId/v1":"32630240386a6841f3a0dc5fdc122b2015ed2a1da7ebbcfc6e2fd23ff61de94d"}},{"ruleId":"D1","level":"warning","message":{"text":"ClangTranspiler.renderAll (cyclomatic 29): ClangTranspiler.renderAll 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangTranspiler.scala"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"034c8ac5d1dbcb36bf28e9b03b456da6002f6f4fb1926d3303d60d3edc4db36d"}},{"ruleId":"D1","level":"warning","message":{"text":"StrPart.matchString (cyclomatic 28): StrPart.matchString 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":"core/src/main/scala/dev/bosatsu/pattern/StrPart.scala"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"16b68a145f679ec712df07a4c635b13cce1e48d094d191db31d1c77a98f1e1b9"}},{"ruleId":"D1","level":"warning","message":{"text":"PackageMap.inferAllSourceUnits (cyclomatic 27): PackageMap.inferAllSourceUnits has cyclomatic complexity 27 (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":"core/src/main/scala/dev/bosatsu/PackageMap.scala"},"region":{"startLine":589}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab05f475a1a0333ea1649eeb7d1b87dd5283fcfdb44ad1d49ec7dc5c7bb128f"}},{"ruleId":"D1","level":"warning","message":{"text":"SelfCallKind.applyWithMode (cyclomatic 27): SelfCallKind.applyWithMode 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":"core/src/main/scala/dev/bosatsu/SelfCallKind.scala"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b94c4489bd0d9904934bdd8381ce92a3df13f32a6b1f583009bd6dd871acf07"}},{"ruleId":"D1","level":"warning","message":{"text":"Solver.shapeToKnown (cyclomatic 27): Solver.shapeToKnown 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":"core/src/main/scala/dev/bosatsu/Shape.scala"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"66132ed8611bd03c1859aade28695144a5dfdeb4d07dffb2dbeda64953ffbdd3"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeParser.toDoc (cyclomatic 27): TypeParser.toDoc 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":"core/src/main/scala/dev/bosatsu/TypeParser.scala"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"1901cf8efa905039934cc7dbfc2b552448c57820dd520b4381971bb326cfab78"}},{"ruleId":"D1","level":"warning","message":{"text":"TypeValidator.patternBindingTypes (cyclomatic 27): TypeValidator.patternBindingTypes 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":"core/src/main/scala/dev/bosatsu/TypeValidator.scala"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d82e627ee7524251fb7fbd681a5caae87e5302d6e61fbebc6034ba5d259d584"}},{"ruleId":"D1","level":"warning","message":{"text":"InvariantTypedExpr.foreachTraversedType (cyclomatic 27): InvariantTypedExpr.foreachTraversedType 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2011}}}],"partialFingerprints":{"codehealthFindingId/v1":"716aab81428570a5e0ee254e181baceaa5aed916d02afc8e1f839166be21e783"}},{"ruleId":"D1","level":"warning","message":{"text":"Code.exprToDoc (cyclomatic 26): Code.exprToDoc has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/python/Code.scala"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3b4b12402f40486537387e26ae5f494e0f93627b3fc0494256cf2811652c737"}},{"ruleId":"D1","level":"warning","message":{"text":"Relatable.unionRelCompare1 (cyclomatic 26): Relatable.unionRelCompare1 has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/set/Relatable.scala"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"c33f06cd19aa6d780f22bad60ba72cec2ccfbe96f4aa228de80c5f2f68627b9e"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefImpl.prog_core_spawn (cyclomatic 25): PredefImpl.prog_core_spawn 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3519}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6cdc65e0ec06ddb453bd5314db92d85282a4d8c3bc5790bcd7a3d7941dba54f"}},{"ruleId":"D1","level":"warning","message":{"text":"SourceConverter.unTuplePattern (cyclomatic 25): SourceConverter.unTuplePattern 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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":1987}}}],"partialFingerprints":{"codehealthFindingId/v1":"c793d0ccefdcbc876768ea261da319c87e9a8fd10fb83e1564c94fa17b9f7976"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprNormalization.unshadowInlineBinders (cyclomatic 25): TypedExprNormalization.unshadowInlineBinders 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc440f15b329e41e5ce922d90735f99b330cdcf7a2b1795fcb6472c57dd566a8"}},{"ruleId":"D1","level":"warning","message":{"text":"AssembleCommand.opts (cyclomatic 25): AssembleCommand.opts has cyclomatic complexity 25 (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":"core/src/main/scala/dev/bosatsu/tool_command/AssembleCommand.scala"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dde2708a811d699587305c65345115f854e15471aac62ad03c6ff6d1a8a4701"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefIoCorePlatform.core_copy_bytes_impl (cyclomatic 24): PredefIoCorePlatform.core_copy_bytes_impl 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f5efe0f9816b4b398666cb8571ec91332e37b5d57a3542dea0c661f932850ce"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.globalRefs (cyclomatic 24): Expr.globalRefs 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":"core/src/main/scala/dev/bosatsu/Expr.scala"},"region":{"startLine":913}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8bcf8ff262c271227e717ad74fadd359ae0a5f279655e9a3502d9185560a55c"}},{"ruleId":"D1","level":"warning","message":{"text":"State.addTypeConstraints (cyclomatic 24): State.addTypeConstraints 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":"core/src/main/scala/dev/bosatsu/KindFormula.scala"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6a38316dec4ad9c589a6eb6b7d759bf34572029575bec736ddbf6b081b9117e"}},{"ruleId":"D1","level":"warning","message":{"text":"PackageCustoms.allImportsAreUsed (cyclomatic 24): PackageCustoms.allImportsAreUsed 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":"core/src/main/scala/dev/bosatsu/PackageCustoms.scala"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"a20fae16c99df362575d81f4deb091f2f5bf18b186ed6809ef2c8d7c5e8f7cd9"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefImpl.core_copy_bytes_impl (cyclomatic 24): PredefImpl.core_copy_bytes_impl 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2392}}}],"partialFingerprints":{"codehealthFindingId/v1":"19916aaa6e6f2e1b11a9f07f1148e2ebe629373f21bd66531cc93b78e135df06"}},{"ruleId":"D1","level":"warning","message":{"text":"ProtoConverter.buildPatterns (cyclomatic 24): ProtoConverter.buildPatterns 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"51461d73cd4b7b831e69732c38b988177aaa9d1b6ed4d480d4e20aac31512a33"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprNormalization.sinkLetIntoBranchingBody (cyclomatic 24): TypedExprNormalization.sinkLetIntoBranchingBody 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1451}}}],"partialFingerprints":{"codehealthFindingId/v1":"7da57a08a94d0da0646cfc0e334e5bad3eec970515451df4f8c99081000c5c4a"}},{"ruleId":"D1","level":"warning","message":{"text":"Declaration.toPattern (cyclomatic 23): Declaration.toPattern 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. This is NOT this file\u0027s highest cyclomatic complexity: Declaration.freeVars (cyclomatic 30) 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 method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"173dde884cff21b303028013e3dd5fa57bbae5dcee68a1b5f53df41b9a4812cf"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.undistribute (cyclomatic 23): Expr.undistribute 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1093}}}],"partialFingerprints":{"codehealthFindingId/v1":"526a6be89767bf5671a4a9d8a0c2b9063f59a0f8c6ae81c4e5d49439380c05e2"}},{"ruleId":"D1","level":"warning","message":{"text":"Stack.stackOrder (cyclomatic 23): Stack.stackOrder 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1421}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6d4f1a31957c7a0dd654ae00c5313fad7570bfc693f234d0a2218b91ce9c679"}},{"ruleId":"D1","level":"warning","message":{"text":"EvalBenchmarkMain.parseArgs (cyclomatic 22): EvalBenchmarkMain.parseArgs has cyclomatic complexity 22 (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":"cli/src/main/scala/dev/bosatsu/EvalBenchmarkMain.scala"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"5df813b00cd43bbbecd517af26dfde9fc732cc0a7f26aeccde0658e51d7e57aa"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.freeBoundTyVars (cyclomatic 22): Expr.freeBoundTyVars has cyclomatic complexity 22 (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":"core/src/main/scala/dev/bosatsu/Expr.scala"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"4836f796fe7f4c61bf4768ba5872b9b047776d526c7a090253be4137043fa37b"}},{"ruleId":"D1","level":"warning","message":{"text":"PackageMap.resolvePackages (cyclomatic 22): PackageMap.resolvePackages has cyclomatic complexity 22 (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":"core/src/main/scala/dev/bosatsu/PackageMap.scala"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"fada57fe3c4469c529615435322e9ef95ed6b1267e503c5f60eb7a4ffc2b1581"}},{"ruleId":"D1","level":"warning","message":{"text":"ProtoConverter.referantFromProto (cyclomatic 22): ProtoConverter.referantFromProto has cyclomatic complexity 22 (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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":1808}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6a5aa9b3dbbfa0002cf3a95cb1a8e1e2c1579464a99c567828dc0702a1cec3e"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExpr.substituteAll (cyclomatic 22): TypedExpr.substituteAll has cyclomatic complexity 22 (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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3543}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffb54d366164a39c06a688d9905621794297e70558d9d6371446ac2efdb241a2"}},{"ruleId":"D1","level":"warning","message":{"text":"ResolveToLambda.parameterDemandSummary (cyclomatic 22): ResolveToLambda.parameterDemandSummary has cyclomatic complexity 22 (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2333}}}],"partialFingerprints":{"codehealthFindingId/v1":"35eacba6acab67d20a54d1142dbd7eafe68d0fcf2a3dfcc452f1194330068903"}},{"ruleId":"D1","level":"warning","message":{"text":"CodeGenerator.resolveFieldType (cyclomatic 22): CodeGenerator.resolveFieldType has cyclomatic complexity 22 (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":"core/src/main/scala/dev/bosatsu/protobuf/CodeGenerator.scala"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"c084148dabcee2dc4eec4f2fb41342ec9df424b8037cdd52639968f1c4ff3b11"}},{"ruleId":"D1","level":"warning","message":{"text":"State.kindOfType (cyclomatic 21): State.kindOfType 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":"core/src/main/scala/dev/bosatsu/KindFormula.scala"},"region":{"startLine":861}}}],"partialFingerprints":{"codehealthFindingId/v1":"56e529332e618126c6a64f3e996cf929cb6390a3e04885d4718119ff46eaa412"}},{"ruleId":"D1","level":"warning","message":{"text":"MatchlessGlobalInlining.summarizeValue (cyclomatic 21): MatchlessGlobalInlining.summarizeValue 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: MatchlessGlobalInlining.collectGlobals (cyclomatic 26) 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 method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":766}}}],"partialFingerprints":{"codehealthFindingId/v1":"c29121371c886a1e898d191b208c6e7b1b6df43bd0fb4e83982925b86bf0ab83"}},{"ruleId":"D1","level":"warning","message":{"text":"Stack.maybeBigInt (cyclomatic 21): Stack.maybeBigInt 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1207}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d7e841e8892afb99ff11b78624994029497ddbf71ab661e5bc253c344c43fb"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExpr.substituteTypeVar (cyclomatic 21): TypedExpr.substituteTypeVar has cyclomatic complexity 21 (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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3843}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6f48db4b4c69a310c880fe5ac277cbdb3f560a7a67195602dd03eff84dde624"}},{"ruleId":"D1","level":"warning","message":{"text":"Type.freeTyVars (cyclomatic 21): Type.freeTyVars 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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":1235}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ba7f721e7015c7bdc11fef5f3de2ba473c0fc53dd85b14e15e8f1a3af34e045"}},{"ruleId":"D1","level":"warning","message":{"text":"ShowEdn.decodePackage (cyclomatic 21): ShowEdn.decodePackage has cyclomatic complexity 21 (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. This is NOT this file\u0027s highest cyclomatic complexity: ShowEdn.encodeMatchlessExpr (cyclomatic 26) 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 method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1458}}}],"partialFingerprints":{"codehealthFindingId/v1":"554155388690d6622e8a95f0b51e2a675a87e1db872dcb804058066e76b330cd"}},{"ruleId":"D1","level":"warning","message":{"text":"Pattern.filterVars (cyclomatic 20): Pattern.filterVars 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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cb07395480703214dce3ddfad4765433f32c6ab8d164edd1c6cc6956c2d07bf"}},{"ruleId":"D1","level":"warning","message":{"text":"Pattern.compiledDocument (cyclomatic 20): Pattern.compiledDocument has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":1248}}}],"partialFingerprints":{"codehealthFindingId/v1":"e105fef8b06c845853e216e2d24873c41598f78afc4498bcdaac854161458d04"}},{"ruleId":"D1","level":"warning","message":{"text":"ProtoConverter.patternToProto (cyclomatic 20): ProtoConverter.patternToProto has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":1043}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac6249bc43efaba68a5e72a6a7587310dc0874b40291d585f59dac9d3645fce1"}},{"ruleId":"D1","level":"warning","message":{"text":"DecodedLibraryWithDeps.decodedLibraryWithDepsCompilationSource (cyclomatic 20): DecodedLibraryWithDeps.decodedLibraryWithDepsCompilationSource has cyclomatic complexity 20 (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":"core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"dec8c551328dc0d7c559709f568c0daeec03bd479ca7f10fef9972ce3baeb80d"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.matches (cyclomatic 20): Impl.matches has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/pattern/NamedSeqPattern.scala"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f7036a9da53ddabd58ff4ca0d7c8f10926779da0fcc4105d65197044cb5023f"}},{"ruleId":"D1","level":"warning","message":{"text":"Json.toDocStackSafe (cyclomatic 19): Json.toDocStackSafe 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":"core/src/main/scala/dev/bosatsu/Json.scala"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cde36deb00e4fbeaed9f53367bc08a9dcb9de5c55bb3231bb1b9e19cf885f18"}},{"ruleId":"D1","level":"warning","message":{"text":"BoolExpr.referencesBindable (cyclomatic 19): BoolExpr.referencesBindable 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. This shape REPEATS in the file: one other method here (BoolExpr.referencesLocalAnon) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared. This is NOT this file\u0027s highest cyclomatic complexity: Matchless.substituteClosureSlots (cyclomatic 29) 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 method is counted neither in this dimension\u0027s figures nor in its score. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":3691}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b0fcba0e3b251d544c63d9166b031ce525b341ce07cfb47bf54988620b60d38"}},{"ruleId":"D1","level":"warning","message":{"text":"BoolExpr.referencesLocalAnon (cyclomatic 19): BoolExpr.referencesLocalAnon 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. This shape REPEATS in the file: one other method here (BoolExpr.referencesBindable) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared. This is NOT this file\u0027s highest cyclomatic complexity: Matchless.substituteClosureSlots (cyclomatic 29) 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 method is counted neither in this dimension\u0027s figures nor in its score. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":3736}}}],"partialFingerprints":{"codehealthFindingId/v1":"02cf3ce704a01973c631e00967f46df967fd41b8135e38af45b893e4c6543ce7"}},{"ruleId":"D1","level":"warning","message":{"text":"Pattern.substructures (cyclomatic 19): Pattern.substructures 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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"0225d5db7e8f05d3d5446af2bdf32cf22784c3d0be755da13eb1c6fb4b27fa1c"}},{"ruleId":"D1","level":"warning","message":{"text":"Pattern.collisionBinds (cyclomatic 19): Pattern.collisionBinds 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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"11f09e04628941b2bd5d3298e9875447b0746f453870bf5d408e2d087c77ea70"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefImpl.createDirectoryRecursiveWithMode (cyclomatic 19): PredefImpl.createDirectoryRecursiveWithMode 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2817}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a8bb7cc1a898fbf9e7b8a8de51b3a763d3f74c6f03984cd7afdfb8cbf44552"}},{"ruleId":"D1","level":"warning","message":{"text":"Solver.shapeOfType (cyclomatic 19): Solver.shapeOfType 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":"core/src/main/scala/dev/bosatsu/Shape.scala"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"59c8f68d90053138e0416b85cd772317522acac58b76aeae0573b67036857630"}},{"ruleId":"D1","level":"warning","message":{"text":"SourceConverter.toEnumDefinition (cyclomatic 19): SourceConverter.toEnumDefinition has cyclomatic complexity 19 (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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":1630}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b05d67c999477cc81060d88096131b0427ed124fb5cf5c666b72f1fc270015"}},{"ruleId":"D1","level":"warning","message":{"text":"SourceConverter.toLets (cyclomatic 19): SourceConverter.toLets 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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2638}}}],"partialFingerprints":{"codehealthFindingId/v1":"a71702163649db53b75071366434aefeb011761d2c9104fd3ea50bf95a39ea71"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExprNormalization.freeLocalTypes (cyclomatic 19): TypedExprNormalization.freeLocalTypes 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1056}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bbf74ad8ed5b69e958f7abfc65f5bc12c835729405bd8f0c180f311fd64d5e4"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.lowerPatternCondition (cyclomatic 19): Impl.lowerPatternCondition 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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":1820}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ba5f1cd2fd181a993270e1530bcf1cd5272c9512256e7e65d15c28900faa11e"}},{"ruleId":"D1","level":"warning","message":{"text":"NameMap.alignSubsumedPatternNameTargets (cyclomatic 19): NameMap.alignSubsumedPatternNameTargets has cyclomatic complexity 19 (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":"core/src/main/scala/dev/bosatsu/pattern/NameMap.scala"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d35402712531fa3ffaa32b257c05fae6c9c26225a19bdff542d4ad8268f1b01"}},{"ruleId":"D1","level":"warning","message":{"text":"SetOps.product (cyclomatic 19): SetOps.product 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":"core/src/main/scala/dev/bosatsu/set/SetOps.scala"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"3372563e439c2d55a131403b271a4267e75f0cfdb7240f1a908ac8463faa50fa"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefIoCorePlatform.core_read_utf8_impl (cyclomatic 18): PredefIoCorePlatform.core_read_utf8_impl has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions. This is NOT this file\u0027s highest cyclomatic complexity: PredefIoCorePlatform.ioerror_from_js (cyclomatic 23) 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 method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c42fe85b00ed27ab21b851e17d64d0278a045c1a99443ebe782104993444c55"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefImpl.utf8CharAt (cyclomatic 18): PredefImpl.utf8CharAt has cyclomatic complexity 18 (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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":1537}}}],"partialFingerprints":{"codehealthFindingId/v1":"18cd991b213f903b17e182455d2fe3f7d3bed79b2748c66193dfed0a08667257"}},{"ruleId":"D1","level":"warning","message":{"text":"ProtoConverter.typedExprToProto (cyclomatic 18): ProtoConverter.typedExprToProto 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":1220}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fc6c329e2fa44984c57ab3f23a9569c2d4ea6bd397cd521826c995088b4a5b2"}},{"ruleId":"D1","level":"warning","message":{"text":"RingOpt.norm (cyclomatic 18): RingOpt.norm 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":2279}}}],"partialFingerprints":{"codehealthFindingId/v1":"2752e035c526982ca9e7f29edef5f67ac8651a3394e032448eadda7f53dff67d"}},{"ruleId":"D1","level":"warning","message":{"text":"Stack.toValue (cyclomatic 18): Stack.toValue 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1483}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7ceece756cff6dc171c8ffb761fac813dcec660a99f455e41c45d540699a110"}},{"ruleId":"D1","level":"warning","message":{"text":"TotalityCheck.normalizePattern (cyclomatic 18): TotalityCheck.normalizePattern 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":"core/src/main/scala/dev/bosatsu/TotalityCheck.scala"},"region":{"startLine":1169}}}],"partialFingerprints":{"codehealthFindingId/v1":"db219f6bd30a380ed19000b5d3204d910f51d4b86b59210fc1aa18297d9aa7d6"}},{"ruleId":"D1","level":"warning","message":{"text":"TypedExpr.coerceRho (cyclomatic 18): TypedExpr.coerceRho 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3408}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb17b9a74b1b04b8e8490ba29e12e85006247aed8a457897442d0422472c5b44"}},{"ruleId":"D1","level":"warning","message":{"text":"Env.handleLet (cyclomatic 18): Env.handleLet has cyclomatic complexity 18 (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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"44d632b9ba028dfc19cd54d7a7bdc0f990e1bcc51b6a85b6132f82e521415e9b"}},{"ruleId":"D1","level":"warning","message":{"text":"Output.ccConfOpt (cyclomatic 18): Output.ccConfOpt has cyclomatic complexity 18 (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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangTranspiler.scala"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"977cd7b492848204708afa8eecab6da57cd659ebdf00f56435282cede7ae8491"}},{"ruleId":"D1","level":"warning","message":{"text":"Code.simplifyBoolExpr (cyclomatic 18): Code.simplifyBoolExpr has cyclomatic complexity 18 (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":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c763ddcb4baa38462582f8998fa7524f273cd0888b613a3e0b64beb138ae0c5"}},{"ruleId":"D1","level":"warning","message":{"text":"Code.simplifyTernary (cyclomatic 18): Code.simplifyTernary 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":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2645c6a1dddca83e896f77cfd8d623147b3b19d69e23745a9f3367a6a659d95"}},{"ruleId":"D1","level":"warning","message":{"text":"Code.optimizeBlockOnce (cyclomatic 18): Code.optimizeBlockOnce 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":"core/src/main/scala/dev/bosatsu/codegen/python/Code.scala"},"region":{"startLine":1096}}}],"partialFingerprints":{"codehealthFindingId/v1":"71b33ec7e644593e5663bef81491513aeb7d99e7415e79222ab3c1f37cea5c4f"}},{"ruleId":"D1","level":"warning","message":{"text":"DecodedLibrary.decodeWithDeps (cyclomatic 18): DecodedLibrary.decodeWithDeps has cyclomatic complexity 18 (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":"core/src/main/scala/dev/bosatsu/library/DecodedLibrary.scala"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf426260901dbc758c52bbf208305e098a1e08336c313ec13fec9401fba1715d"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefIoCorePlatform.mkdirWithModeRecursive (cyclomatic 17): PredefIoCorePlatform.mkdirWithModeRecursive 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: PredefIoCorePlatform.ioerror_from_js (cyclomatic 23) 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 method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":1081}}}],"partialFingerprints":{"codehealthFindingId/v1":"2608a60abc8fe939cc5bdf4125f65fc4789a49166e11b10d9d20c49f66c86fb4"}},{"ruleId":"D1","level":"warning","message":{"text":"Analyzer.checkType (cyclomatic 17): Analyzer.checkType 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":"core/src/main/scala/dev/bosatsu/Inhabitedness.scala"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"49f9c350b029db55eb2e2941988df0660c2dc377e5729053219a208fe1212fdf"}},{"ruleId":"D1","level":"warning","message":{"text":"Env.boolExpr (cyclomatic 17): Env.boolExpr 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":"core/src/main/scala/dev/bosatsu/MatchlessToValue.scala"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"1399887ba464673b1b4b6897812d6cce271cb559163d16e1c550b959fd081d30"}},{"ruleId":"D1","level":"warning","message":{"text":"KindInferenceError.message (cyclomatic 17): KindInferenceError.message 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":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":2271}}}],"partialFingerprints":{"codehealthFindingId/v1":"685bfd110c57eeb0d8d7a74b157c16d1570484d675cccda89863a7f2832c0828"}},{"ruleId":"D1","level":"warning","message":{"text":"Error.showExpectations (cyclomatic 17): Error.showExpectations 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":"core/src/main/scala/dev/bosatsu/Parser.scala"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"9354c8734b5d793eb697c95a7a7370a0c001530150660baf3b5748d49deb86c6"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefImpl.prog_core_create_temp_file (cyclomatic 17): PredefImpl.prog_core_create_temp_file 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3155}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c0742f5ac42e7b2e44dfc65eaf91c0c1e705660d4db2741ac062d99f18301c3"}},{"ruleId":"D1","level":"warning","message":{"text":"RingOpt.normConstMult (cyclomatic 17): RingOpt.normConstMult 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1753}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5b6bcbc3e3ae6efa801a21aba11a75d8179829a686cc233f20f63924258c3e1"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.evaluate (cyclomatic 17): Impl.evaluate 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2821}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7a714085e5435ed631a92177e8b7b8750fefb9545cd21bf34bd3953663b4a73"}},{"ruleId":"D1","level":"warning","message":{"text":"Test.values (cyclomatic 17): Test.values 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangTranspiler.scala"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecef9b2179fa7cdf3977ca88005a9921ecee0ba04101591cfd5ad7ac77eb62a4"}},{"ruleId":"D1","level":"warning","message":{"text":"SeqPattern.matcher (cyclomatic 17): SeqPattern.matcher has cyclomatic complexity 17 (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":"core/src/main/scala/dev/bosatsu/pattern/SeqPattern.scala"},"region":{"startLine":698}}}],"partialFingerprints":{"codehealthFindingId/v1":"2092bce2593148850a8c61e54d240861b18a92d0f815556f0022ab9b0e6ca231"}},{"ruleId":"D1","level":"warning","message":{"text":"Type.substituteVar (cyclomatic 17): Type.substituteVar 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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"71783f329bc443520bb827ed3352fa19f77ffde7e6820b61409e889f80d44c6f"}},{"ruleId":"D1","level":"warning","message":{"text":"Relatable.listUnion (cyclomatic 17): Relatable.listUnion 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":"core/src/main/scala/dev/bosatsu/set/Relatable.scala"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"9388ae905f8632fe9c2d6bd98ceffb24fbe36d3d82cec1785a474d60438d44b3"}},{"ruleId":"D1","level":"warning","message":{"text":"SourceDocs.fromStatements (cyclomatic 17): SourceDocs.fromStatements 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":"core/src/main/scala/dev/bosatsu/tool/MarkdownDoc.scala"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"dab59c8fba5b76f2166569381abb5078c2420adbb0800c6fbacbf28a3dee8b48"}},{"ruleId":"D1","level":"warning","message":{"text":"ShowEdn.decodeImportedName (cyclomatic 17): ShowEdn.decodeImportedName has cyclomatic complexity 17 (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. This is NOT this file\u0027s highest cyclomatic complexity: ShowEdn.encodeMatchlessExpr (cyclomatic 26) 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 method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1162}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d00c451a7aab031e63a5b2b3efbc352cd634cfb211a1af17088f69764d794c5"}},{"ruleId":"D1","level":"warning","message":{"text":"Kind.kinds (cyclomatic 16): Kind.kinds 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":"core/src/main/scala/dev/bosatsu/Kind.scala"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab115fe36879c6b1f3eaedb6e63eec3392d24bd0a5e8dd5c170287885319126d"}},{"ruleId":"D1","level":"warning","message":{"text":"Matchless.topLevelFunctionArity (cyclomatic 16): Matchless.topLevelFunctionArity 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. This is NOT this file\u0027s highest cyclomatic complexity: Matchless.substituteClosureSlots (cyclomatic 29) 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 method is counted neither in this dimension\u0027s figures nor in its score. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":2151}}}],"partialFingerprints":{"codehealthFindingId/v1":"0856a477bd70c7295da5c2b275258a6b9b4c0f2abce75c2a2e72f2503bc2032b"}},{"ruleId":"D1","level":"warning","message":{"text":"StringMatcher.matchStringParts (cyclomatic 16): StringMatcher.matchStringParts 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. This is NOT this file\u0027s highest cyclomatic complexity: Matchless.substituteClosureSlots (cyclomatic 29) 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 method is counted neither in this dimension\u0027s figures nor in its score. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: core/src/main/scala/dev/bosatsu/Matchless.scala holds 18 of the 173 methods over the threshold \u2014 including the worst \u2014 and 959 of the 3804 points over it (25%), 2.8\u00D7 the next-largest file (core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala at 348). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":5118}}}],"partialFingerprints":{"codehealthFindingId/v1":"a830c0c14695b7152d1304d06c64b1594e0cfa5c64fb7814cbd4e6eb23b5f284"}},{"ruleId":"D1","level":"warning","message":{"text":"PackageMap.resolveAllSourceUnits (cyclomatic 16): PackageMap.resolveAllSourceUnits 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":"core/src/main/scala/dev/bosatsu/PackageMap.scala"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7cdec6f790ff3b95b003087d97abfa417ae327a37a8f9b1771a1d7c35375615"}},{"ruleId":"D1","level":"warning","message":{"text":"Pattern.substitute (cyclomatic 16): Pattern.substitute 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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc74768f71b2328ae627ee44b26e36ab0f2ee58cb7dcc08d70d3084900c3e813"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefImpl.read_utf8_chunk (cyclomatic 16): PredefImpl.read_utf8_chunk 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":1632}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8bdda16e8278ceb8d415375b737f49168a43dbc35c7eba1ac3a8bdf09a4e55f"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefImpl.core_write_utf8_impl (cyclomatic 16): PredefImpl.core_write_utf8_impl 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2499}}}],"partialFingerprints":{"codehealthFindingId/v1":"89b6a1ad8ece341902fe985edbfff52c54a2f5eb5acc72f786219d002e3bc134"}},{"ruleId":"D1","level":"warning","message":{"text":"PredefImpl.run_prog (cyclomatic 16): PredefImpl.run_prog 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3772}}}],"partialFingerprints":{"codehealthFindingId/v1":"60eaeeff4e00882473e841ee878dc445f654c8be60eaa978f2d92ddc21399b53"}},{"ruleId":"D1","level":"warning","message":{"text":"Expr.addAll (cyclomatic 16): Expr.addAll 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":996}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ad2b7fb32a553612ef23451c62a68bda98c615160febf0e442ced854c965405"}},{"ruleId":"D1","level":"warning","message":{"text":"Stack.hashStack (cyclomatic 16): Stack.hashStack 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1376}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa46d8099d5c270951c57a8119f987086471d25f920a9d527b9c719b90c8dd5"}},{"ruleId":"D1","level":"warning","message":{"text":"SumProd.splits (cyclomatic 16): SumProd.splits 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1953}}}],"partialFingerprints":{"codehealthFindingId/v1":"91a77427cbe619ceee3ea1d756c7d1b05f73b2343e0dc4a70decbc179b6ef676"}},{"ruleId":"D1","level":"warning","message":{"text":"SourceConverter.toProgram (cyclomatic 16): SourceConverter.toProgram 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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2789}}}],"partialFingerprints":{"codehealthFindingId/v1":"a131b2d4c6f79a8861cae467a42a45a8127b593eb9b02bc065f9446964c6afd2"}},{"ruleId":"D1","level":"warning","message":{"text":"Impl.checkApply (cyclomatic 16): Impl.checkApply 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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":3391}}}],"partialFingerprints":{"codehealthFindingId/v1":"b010c2ec7bbf56e7aa038395dbb272e9a0af53a5e156845e52ecfb4f5ee49cc1"}},{"ruleId":"D1","level":"warning","message":{"text":"Type.renameMetaAndSkolemsToBounds (cyclomatic 16): Type.renameMetaAndSkolemsToBounds 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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffd958f02cc8bc963bcf5a1bc9db8f7d9050325884e5da2d887baba477e6b845"}},{"ruleId":"D1","level":"warning","message":{"text":"SmtExpr.pathImplies (cyclomatic 16): SmtExpr.pathImplies 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":"core/src/main/scala/dev/bosatsu/smt/SmtExpr.scala"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"0741f6672f1f3fe27da5cf95e28d79f62b02aa7156fabcb0cc9a7fbe0fc1895b"}},{"ruleId":"D1","level":"warning","message":{"text":"CompilerApi.typeCheckWithLintMode (cyclomatic 16): CompilerApi.typeCheckWithLintMode 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. This is NOT this file\u0027s highest cyclomatic complexity: CompilerApi.classifyError (cyclomatic 25) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"f47f952425fd8beef0bc0db0e0841ac3ae1a2f514836915ccd3d17aa62ef34fd"}},{"ruleId":"D2","level":"warning","message":{"text":"Matchless.fromLetRaw (cognitive 771): Matchless.fromLetRaw has cognitive complexity 771 (threshold 15). Drivers by points: if/else 212 (327 pts), match/switch 155 (280 pts), loops 35 (109 pts), boolean chains 53, error handling 1 (2 pts) (nesting depth added 315). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":5400}}}],"partialFingerprints":{"codehealthFindingId/v1":"56a8feac685f8812abdd09991d3cc85c06255a055151f6c84296d5e63cafcdcf"}},{"ruleId":"D2","level":"warning","message":{"text":"Command.opts (cognitive 747): Command.opts has cognitive complexity 747 (threshold 15). Drivers by points: loops 99 (277 pts), match/switch 72 (260 pts), if/else 84 (206 pts), boolean chains 4 (nesting depth added 488). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbecb7d535e7a273f6f19a0f82198bf46debc2ac51122eb9c54baac2138f2f02"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprNormalization.normalizeLetOpt (cognitive 266): TypedExprNormalization.normalizeLetOpt has cognitive complexity 266 (threshold 15). Drivers by points: if/else 78 (162 pts), match/switch 27 (80 pts), boolean chains 24 (nesting depth added 137). 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1526}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0f1ac33bac8d3e861f4ec3568e51fa21a997c872f1d863e796bdc32c42f66f0"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueToJson.toValue (cognitive 234): ValueToJson.toValue has cognitive complexity 234 (threshold 15). Drivers by points: match/switch 37 (146 pts), if/else 43 (81 pts), loops 1 (4 pts), boolean chains 3 (nesting depth added 150). 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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":695}}}],"partialFingerprints":{"codehealthFindingId/v1":"e91ecad8e3eef694655171572f7cbdf7d7a9ea942860e9d941a386d3fb9795bd"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.typeCheckRho (cognitive 224): Impl.typeCheckRho has cognitive complexity 224 (threshold 15). Drivers by points: loops 35 (151 pts), match/switch 18 (57 pts), if/else 11 (16 pts) (nesting depth added 160). 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2289}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2d508182dfae821b79c9a86b278fb99a45c73d54c0a7df7068807fed3856931"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueToJson.toJson (cognitive 213): ValueToJson.toJson has cognitive complexity 213 (threshold 15). Drivers by points: match/switch 39 (142 pts), if/else 43 (65 pts), loops 1 (4 pts), boolean chains 2 (nesting depth added 128). 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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cdcb568d7bf137e01d715bed7a3d76a967b9402ee5cb6f7f14178899e579535"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceConverter.fromDecl (cognitive 203): SourceConverter.fromDecl has cognitive complexity 203 (threshold 15). Drivers by points: match/switch 39 (122 pts), if/else 39 (75 pts), boolean chains 6 (nesting depth added 119). 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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"08586c89e89cfe8a9650417c05dd9fd1cc99e597bf09a08bfe8b07b928b8c063"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.subsCheckRho2 (cognitive 163): Impl.subsCheckRho2 has cognitive complexity 163 (threshold 15). Drivers by points: loops 24 (128 pts), match/switch 4 (21 pts), if/else 6 (13 pts), boolean chains 1 (nesting depth added 128). 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":976}}}],"partialFingerprints":{"codehealthFindingId/v1":"e68e876f1c7b6ae1cc53ed8ea4593e2ac219e0692d55e168f2eb3c9ad5a98902"}},{"ruleId":"D2","level":"warning","message":{"text":"Command.opts (cognitive 150): Command.opts has cognitive complexity 150 (threshold 15). Drivers by points: loops 10 (55 pts), if/else 17 (47 pts), match/switch 15 (46 pts), boolean chains 2 (nesting depth added 106). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/cruntime/Command.scala"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"be5ff98e683ada3929c376409756f4a73b668cb27dbb1d10afe9546235364f34"}},{"ruleId":"D2","level":"warning","message":{"text":"SeqPattern.seqPatternSetOps (cognitive 142): SeqPattern.seqPatternSetOps has cognitive complexity 142 (threshold 15). Drivers by points: if/else 47 (65 pts), loops 12 (53 pts), match/switch 10 (14 pts), boolean chains 10 (nesting depth added 63). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/pattern/SeqPattern.scala"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"08bb1039fa86654b855ec45ef3429b1f0317cfe2ee1a8814e42a241c1168f53c"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeErrorIn.message (cognitive 124): TypeErrorIn.message has cognitive complexity 124 (threshold 15). Drivers by points: if/else 55 (79 pts), match/switch 25 (41 pts), boolean chains 4 (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":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecc18236d30dd6898f1d5a4c51d09b8b4c49723b8add47dd441bd608c502116a"}},{"ruleId":"D2","level":"warning","message":{"text":"Type.instantiate (cognitive 122): Type.instantiate has cognitive complexity 122 (threshold 15). Drivers by points: match/switch 23 (73 pts), if/else 25 (46 pts), boolean chains 3 (nesting depth added 71). 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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"25876711382af255a4eb3835619c8c8652c2dc205d20ffd93b88e657dca19b1a"}},{"ruleId":"D2","level":"warning","message":{"text":"ProtoConverter.packagesFromProto (cognitive 121): ProtoConverter.packagesFromProto has cognitive complexity 121 (threshold 15). Drivers by points: match/switch 21 (55 pts), loops 8 (52 pts), if/else 9 (13 pts), boolean chains 1 (nesting depth added 82). 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":2219}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d3d8d4cfb5029b991b73dec82e485e436f6d1817369426617e58714eb1a7694"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueToDoc.toDoc (cognitive 120): ValueToDoc.toDoc has cognitive complexity 120 (threshold 15). Drivers by points: match/switch 23 (75 pts), if/else 24 (41 pts), loops 1 (4 pts) (nesting depth added 72). 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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"894884215c5ee3858197dd571925923af0f83ffd3ee03e9b235c256dd3dec41f"}},{"ruleId":"D2","level":"warning","message":{"text":"AssembleCommand.opts (cognitive 118): AssembleCommand.opts has cognitive complexity 118 (threshold 15). Drivers by points: loops 16 (82 pts), match/switch 3 (26 pts), if/else 2 (9 pts), boolean chains 1 (nesting depth added 96). 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":"core/src/main/scala/dev/bosatsu/tool_command/AssembleCommand.scala"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"b32a43778ca46f5d0ac2e57dc565b759f1bdc61f01a15b23b1e1bb3591b0fee1"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.maybeEvalMatch (cognitive 116): Impl.maybeEvalMatch has cognitive complexity 116 (threshold 15). Drivers by points: match/switch 24 (75 pts), if/else 21 (39 pts), boolean chains 2 (nesting depth added 69). 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2893}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3e39cfdc8e4a01687c677e36c1a59d1139c32d6a987755a89e7b6e5d6c6b36a"}},{"ruleId":"D2","level":"warning","message":{"text":"Op.simplify (cognitive 115): Op.simplify has cognitive complexity 115 (threshold 15). Drivers by points: match/switch 15 (59 pts), if/else 39 (55 pts), boolean chains 1 (nesting depth added 60). 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":"core/src/main/scala/dev/bosatsu/codegen/python/Code.scala"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"dec2fefb2ce891d7062e50f5d45d35bd4a679bcc4185695d57cae3f334782319"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.core_copy_bytes_impl (cognitive 106): PredefIoCorePlatform.core_copy_bytes_impl has cognitive complexity 106 (threshold 15). Drivers by points: match/switch 6 (45 pts), if/else 7 (31 pts), loops 7 (28 pts), boolean chains 2 (nesting depth added 84). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d6f210a8172dfbe323fbd9731bfa617cda0af574ddf90b6cbeaa343ce4d70bf"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.core_copy_bytes_impl (cognitive 106): PredefImpl.core_copy_bytes_impl has cognitive complexity 106 (threshold 15). Drivers by points: match/switch 6 (45 pts), if/else 7 (31 pts), loops 7 (28 pts), boolean chains 2 (nesting depth added 84). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2392}}}],"partialFingerprints":{"codehealthFindingId/v1":"17755d59f4d49d1fb2afae271ae39858cd7a2e664f8d3df71da92f3775c6a96c"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprNormalization.shareImmutableValues (cognitive 105): TypedExprNormalization.shareImmutableValues has cognitive complexity 105 (threshold 15). Drivers by points: if/else 30 (71 pts), match/switch 9 (14 pts), boolean chains 12, loops 3 (8 pts) (nesting depth added 51). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b2b9e89195a68827f80adbf0efed469d92019d7f291404c30f1fdfd960bb2b6"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeTypedExpr (cognitive 104): ShowEdn.decodeTypedExpr has cognitive complexity 104 (threshold 15). Drivers by points: loops 22 (82 pts), match/switch 5 (17 pts), if/else 5 (nesting depth added 72). 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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"14acf8045484bd3510eb21ced4ec6dbc9554cf90ceb72f007a36c1ab7042c271"}},{"ruleId":"D2","level":"warning","message":{"text":"ClangTranspiler.renderAll (cognitive 95): ClangTranspiler.renderAll has cognitive complexity 95 (threshold 15). Drivers by points: if/else 18 (44 pts), match/switch 9 (29 pts), loops 4 (22 pts) (nesting depth added 64). 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangTranspiler.scala"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"5304585196bdec9497ce841a4cbe352fb450e73ff0c4812455a4b1a8d6a14d9e"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprLoopRecurLowering.rewriteGroupedSelfCalls (cognitive 91): TypedExprLoopRecurLowering.rewriteGroupedSelfCalls has cognitive complexity 91 (threshold 15). Drivers by points: if/else 35 (61 pts), boolean chains 18, match/switch 8 (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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e9e3405c88b55931658fd544daf06463d15748a3bfbd50c1a82a8dcf2b5193d"}},{"ruleId":"D2","level":"warning","message":{"text":"ExprOps.basicNorm (cognitive 88): ExprOps.basicNorm has cognitive complexity 88 (threshold 15). Drivers by points: if/else 32 (48 pts), match/switch 15 (38 pts), boolean chains 2 (nesting depth added 39). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ee112a9d579b69bf9bbf42148cf62d365536c083c76d53dab3e8dfae3c8952a"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.unConstMult (cognitive 86): Expr.unConstMult has cognitive complexity 86 (threshold 15). Drivers by points: if/else 38 (65 pts), match/switch 6 (12 pts), boolean chains 9 (nesting depth added 33). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3ac936e4bc15aa2ff4a18a7c1966fed153013685e25dc464b0cca6dc7495591"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodePackage (cognitive 86): ShowEdn.decodePackage has cognitive complexity 86 (threshold 15). Drivers by points: loops 9 (54 pts), match/switch 6 (31 pts), if/else 1 (nesting depth added 70). 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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1458}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f8aca3d8cf9ebf0deffddef42109576a7085b3fa9a69208850288c6b6f7db7"}},{"ruleId":"D2","level":"warning","message":{"text":"Ops.loop (cognitive 84): Ops.loop has cognitive complexity 84 (threshold 15). Drivers by points: loops 11 (54 pts), match/switch 10 (21 pts), if/else 6 (9 pts) (nesting depth added 57). 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":"core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala"},"region":{"startLine":3623}}}],"partialFingerprints":{"codehealthFindingId/v1":"f20be6830d0dd5a43efa729af63577868e1dcd1724cd8694f1fb61616f4e801b"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeImportedName (cognitive 84): ShowEdn.decodeImportedName has cognitive complexity 84 (threshold 15). Drivers by points: loops 8 (44 pts), match/switch 4 (27 pts), if/else 5 (13 pts) (nesting depth added 67). 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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1162}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dfe3913714a74fadd264d0eae62105e7601101e3efef9c07766ea4fa15e5e82"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.impl (cognitive 80): Env.impl has cognitive complexity 80 (threshold 15). Drivers by points: loops 19 (49 pts), match/switch 13 (19 pts), if/else 11 (12 pts) (nesting depth added 37). 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":1279}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f7c8c5df9f591098c99bc1b76fab714115b62de9776813e7b604eb61f69d3a"}},{"ruleId":"D2","level":"warning","message":{"text":"Matchless.simplifyKnownConditions (cognitive 76): Matchless.simplifyKnownConditions has cognitive complexity 76 (threshold 15). Drivers by points: match/switch 27 (43 pts), if/else 23 (27 pts), boolean chains 6 (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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":3053}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e8384659617758179fee813f6158852a9c474756173bf9c4900abdb2f5b4da7"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeValidator.validateTypeConnections (cognitive 75): TypeValidator.validateTypeConnections has cognitive complexity 75 (threshold 15). Drivers by points: if/else 25 (43 pts), match/switch 14 (32 pts) (nesting depth added 36). 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":"core/src/main/scala/dev/bosatsu/TypeValidator.scala"},"region":{"startLine":687}}}],"partialFingerprints":{"codehealthFindingId/v1":"47a23eb8f23546761f81432e10bb7aa514c95818c5ab3b054c8227842efa814c"}},{"ruleId":"D2","level":"warning","message":{"text":"DocCommand.opts (cognitive 74): DocCommand.opts has cognitive complexity 74 (threshold 15). Drivers by points: loops 10 (55 pts), if/else 2 (11 pts), match/switch 1 (8 pts) (nesting depth added 61). 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":"core/src/main/scala/dev/bosatsu/tool_command/DocCommand.scala"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa8a64fe9fa2df7036e3e9782d599565004a5f63f1d3aa9a9b2e1ab07d359498"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.typeCheckPattern (cognitive 72): Impl.typeCheckPattern has cognitive complexity 72 (threshold 15). Drivers by points: loops 11 (31 pts), match/switch 13 (26 pts), if/else 10 (13 pts), boolean chains 2 (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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2881}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cca327e0c327144e7cd9fa24a2db20dde388d7e6d37980d17767591f89e2a64"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodePattern (cognitive 70): ShowEdn.decodePattern has cognitive complexity 70 (threshold 15). Drivers by points: loops 15 (55 pts), if/else 5 (7 pts), match/switch 3 (7 pts), boolean chains 1 (nesting depth added 46). 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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"5df3f7b2e070f367419801907b407c8cf2adce549ef2ef92235d28b72aff8a1a"}},{"ruleId":"D2","level":"warning","message":{"text":"Analyzer.checkPattern (cognitive 67): Analyzer.checkPattern has cognitive complexity 67 (threshold 15). Drivers by points: if/else 18 (36 pts), match/switch 8 (28 pts), boolean chains 3 (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":"core/src/main/scala/dev/bosatsu/Inhabitedness.scala"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"3538296d5ca41770986421f694e5d92e88d915f220b2ea3b99343a9541770098"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.prog_core_create_temp_file (cognitive 67): PredefImpl.prog_core_create_temp_file has cognitive complexity 67 (threshold 15). Drivers by points: loops 7 (28 pts), error handling 3 (21 pts), if/else 4 (11 pts), match/switch 2 (7 pts) (nesting depth added 51). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3155}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ce39d9c9604671b666224b969c56af3d97299d76772dc702293a46a4445087f"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.prog_core_spawn (cognitive 66): PredefImpl.prog_core_spawn has cognitive complexity 66 (threshold 15). Drivers by points: loops 7 (25 pts), if/else 11 (20 pts), match/switch 6 (17 pts), error handling 1 (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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3519}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf1ccb8c1e4ba1babe48b9498eb873fec7db773ecd97d608dfb339ee70b7af67"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprNormalization.prependArgsToFnCalls (cognitive 65): TypedExprNormalization.prependArgsToFnCalls has cognitive complexity 65 (threshold 15). Drivers by points: if/else 32 (52 pts), boolean chains 10, loops 1 (2 pts), match/switch 1 (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1249}}}],"partialFingerprints":{"codehealthFindingId/v1":"f40d41d162860aaeb8a41bcec86eb7e64d810f4692d1e0a7a1dcca21d70a9ee4"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.core_read_utf8_impl (cognitive 63): PredefIoCorePlatform.core_read_utf8_impl has cognitive complexity 63 (threshold 15). Drivers by points: match/switch 6 (33 pts), if/else 10 (20 pts), loops 4 (10 pts) (nesting depth added 43). 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf9db33ba41dbbde56ecb3691751c92ec7a622be1a82ad33bac598475fa09d5"}},{"ruleId":"D2","level":"warning","message":{"text":"StringMatcher.searchStringWithLiteralRest (cognitive 63): StringMatcher.searchStringWithLiteralRest has cognitive complexity 63 (threshold 15). Drivers by points: loops 8 (44 pts), match/switch 1 (10 pts), if/else 6 (8 pts), boolean chains 1 (nesting depth added 47). 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":5005}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6bd43473dd0e198af54991276538794e2749c9a883fd59414f71bd7b69a92f"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.checkExpr (cognitive 63): Impl.checkExpr has cognitive complexity 63 (threshold 15). Drivers by points: match/switch 11 (30 pts), loops 4 (22 pts), if/else 8 (11 pts) (nesting depth added 40). 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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":3519}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf3f0d2409376e343d6273fc2198405ec0fe01c06397c6b8f35008ded50ee796"}},{"ruleId":"D2","level":"warning","message":{"text":"Matchless.reuseConstructors (cognitive 62): Matchless.reuseConstructors has cognitive complexity 62 (threshold 15). Drivers by points: match/switch 25 (37 pts), if/else 23, boolean chains 2 (nesting depth added 12). 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":2249}}}],"partialFingerprints":{"codehealthFindingId/v1":"666311addd352e633e80febcdf6d686e4f62c3620bdc4d26393b0a3a7ae9ad4f"}},{"ruleId":"D2","level":"warning","message":{"text":"MatchlessGlobalInlining.rewriteExpr (cognitive 62): MatchlessGlobalInlining.rewriteExpr has cognitive complexity 62 (threshold 15). Drivers by points: match/switch 20 (37 pts), if/else 20 (23 pts), boolean chains 2 (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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"57175975ec96051641fbf396d3e05be0a5471182bfcc0b9d470560f8412c9710"}},{"ruleId":"D2","level":"warning","message":{"text":"Code.toDoc (cognitive 60): Code.toDoc has cognitive complexity 60 (threshold 15). Drivers by points: match/switch 16 (31 pts), if/else 22 (28 pts), boolean chains 1 (nesting depth added 21). 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":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":785}}}],"partialFingerprints":{"codehealthFindingId/v1":"b61b4d4308ec4d02b8bb2bdba6da8074e980950a14c3f46b68c86eed6dffc449"}},{"ruleId":"D2","level":"warning","message":{"text":"Declaration.substitute (cognitive 58): Declaration.substitute has cognitive complexity 58 (threshold 15). Drivers by points: if/else 32 (41 pts), match/switch 10 (17 pts) (nesting depth added 16). 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":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":569}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4e0e476ce5c7deef07417e118604a44f27d9125afe5ad1db25d5d9ca58762eb"}},{"ruleId":"D2","level":"warning","message":{"text":"StrPart.matchString (cognitive 58): StrPart.matchString has cognitive complexity 58 (threshold 15). Drivers by points: if/else 18 (42 pts), loops 2 (6 pts), boolean chains 5, match/switch 2 (3 pts), error handling 1 (2 pts) (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":"core/src/main/scala/dev/bosatsu/pattern/StrPart.scala"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ada58eb74f1310778aa34581b6901f5e8d722a1b7b2c4b1cc953e0e6edf2b2"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.innerToValue (cognitive 57): Env.innerToValue has cognitive complexity 57 (threshold 15). Drivers by points: loops 8 (26 pts), if/else 10 (20 pts), match/switch 6 (11 pts) (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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9bde40c6e2ba7dfe662c395d37e967f65287df4ea6743c65504793011466c1b"}},{"ruleId":"D2","level":"warning","message":{"text":"PackageMap.inferAllSourceUnits (cognitive 56): PackageMap.inferAllSourceUnits has cognitive complexity 56 (threshold 15). Drivers by points: loops 8 (32 pts), match/switch 9 (20 pts), if/else 4 (nesting depth added 35). 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":"core/src/main/scala/dev/bosatsu/PackageMap.scala"},"region":{"startLine":589}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa8dea88e4f298f04405bfef2e9c059cc40fb63f67cea7c77633af7502678c5c"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprNormalization.dropOuterRecurArgs (cognitive 56): TypedExprNormalization.dropOuterRecurArgs has cognitive complexity 56 (threshold 15). Drivers by points: if/else 27 (44 pts), boolean chains 6, match/switch 2 (4 pts), loops 1 (2 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":965}}}],"partialFingerprints":{"codehealthFindingId/v1":"21cb5126617718f5f1b34d2837b925c439e349da87734e69a4ad8bbfa5bc7f3b"}},{"ruleId":"D2","level":"warning","message":{"text":"LibConfig.validatePacks (cognitive 56): LibConfig.validatePacks has cognitive complexity 56 (threshold 15). Drivers by points: if/else 24 (41 pts), match/switch 7 (8 pts), loops 4 (6 pts), boolean chains 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/library/LibConfig.scala"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bb6886355f681c36a3403fecd55485ca2765e62b874b1be191e4cf16c34e07a"}},{"ruleId":"D2","level":"warning","message":{"text":"InlineBenefitModel.shouldInlineCall (cognitive 54): InlineBenefitModel.shouldInlineCall has cognitive complexity 54 (threshold 15). Drivers by points: if/else 25 (37 pts), boolean chains 17 (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":"core/src/main/scala/dev/bosatsu/InlineBenefitModel.scala"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"48db8f4a60b00437d954ef998a83c17ee6e445f1bb9647026ec9bbf53fea3a3d"}},{"ruleId":"D2","level":"warning","message":{"text":"State.addTypeConstraints (cognitive 54): State.addTypeConstraints has cognitive complexity 54 (threshold 15). Drivers by points: loops 7 (42 pts), match/switch 4 (8 pts), if/else 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":"core/src/main/scala/dev/bosatsu/KindFormula.scala"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5968c9d7e9534bb9585b21e5239d8f749c9504ebb7480acceca0e9346e1544c"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprLoopRecurLowering.rewriteTailCalls (cognitive 54): TypedExprLoopRecurLowering.rewriteTailCalls has cognitive complexity 54 (threshold 15). Drivers by points: if/else 24 (42 pts), boolean chains 11, match/switch 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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"b65407ddf865d104b927dfbbe6363a7b67de2fd19878479f09da709b0aca0d19"}},{"ruleId":"D2","level":"warning","message":{"text":"VendoredDeps.buildContext (cognitive 54): VendoredDeps.buildContext has cognitive complexity 54 (threshold 15). Drivers by points: loops 9 (45 pts), match/switch 1 (6 pts), if/else 2, boolean chains 1 (nesting depth added 41). 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":"core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf40f3568510f2bfc2771c50c48a79326b0cde5b0e2418444897eda349453bb"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.utf8CharAt (cognitive 53): PredefImpl.utf8CharAt has cognitive complexity 53 (threshold 15). Drivers by points: loops 6 (28 pts), if/else 15 (23 pts), boolean chains 2 (nesting depth added 30). 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":1537}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b556b95b0c0db8e76085ece231ec1d8b11dbab87fc8cee04b562ddaea8a9217"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.stackTraverseExpr (cognitive 53): TypedExpr.stackTraverseExpr has cognitive complexity 53 (threshold 15). Drivers by points: match/switch 6 (24 pts), loops 7 (21 pts), if/else 3 (8 pts) (nesting depth added 37). 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":1759}}}],"partialFingerprints":{"codehealthFindingId/v1":"780ac2da9e91b19fadcb2670719cb052af2258c59a714444c1e32db6c6194955"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.mkdirWithModeRecursive (cognitive 51): PredefIoCorePlatform.mkdirWithModeRecursive has cognitive complexity 51 (threshold 15). Drivers by points: match/switch 5 (26 pts), if/else 9 (20 pts), error handling 1 (3 pts), loops 1 (2 pts) (nesting depth added 35). 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":1081}}}],"partialFingerprints":{"codehealthFindingId/v1":"61ac75cb24f3691d8dd9d75dbbeefb1b6e2401e68a2f3a38fd27344a9ec99daf"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.createDirectoryRecursiveWithMode (cognitive 51): PredefImpl.createDirectoryRecursiveWithMode has cognitive complexity 51 (threshold 15). Drivers by points: match/switch 5 (23 pts), if/else 8 (20 pts), error handling 2 (6 pts), loops 1 (2 pts) (nesting depth added 35). 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2817}}}],"partialFingerprints":{"codehealthFindingId/v1":"64c8cf26b5b6aae05af014aeedf9d5e4e860bbca8f79620e5bebd41875508d71"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.handleLet (cognitive 50): Env.handleLet has cognitive complexity 50 (threshold 15). Drivers by points: loops 11 (43 pts), match/switch 3 (6 pts), if/else 1 (nesting depth added 35). 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"641d5e0a8a5cdd734f57233b021be77e1ed44097f1073f1423412603b59ee02b"}},{"ruleId":"D2","level":"warning","message":{"text":"ApiDiff.apply (cognitive 49): ApiDiff.apply has cognitive complexity 49 (threshold 15). Drivers by points: match/switch 12 (26 pts), if/else 18 (23 pts) (nesting depth added 19). 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":"core/src/main/scala/dev/bosatsu/library/ApiDiff.scala"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df922f40c1c345af5918180beb68d4620e00b0d01c292ebbe447ba7cadf954b"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.replaceVarType (cognitive 48): TypedExpr.replaceVarType has cognitive complexity 48 (threshold 15). Drivers by points: if/else 21 (38 pts), loops 2 (5 pts), match/switch 2 (3 pts), boolean chains 2 (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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3951}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e8d0f17a9692a95d921b1bf0809beb52438ffba24e263688b62c07232f49bd2"}},{"ruleId":"D2","level":"warning","message":{"text":"VendoredDeps.ensureSourceTree (cognitive 48): VendoredDeps.ensureSourceTree has cognitive complexity 48 (threshold 15). Drivers by points: loops 9 (46 pts), if/else 1, match/switch 1 (nesting depth added 37). 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":"core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala"},"region":{"startLine":593}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b06bdeca8aa32b54e4bd2c6592784d5b3db8ad8b98654aad86a3680590f5502"}},{"ruleId":"D2","level":"warning","message":{"text":"Solver.unifyShape (cognitive 47): Solver.unifyShape has cognitive complexity 47 (threshold 15). Drivers by points: match/switch 11 (38 pts), if/else 6 (9 pts) (nesting depth added 30). 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":"core/src/main/scala/dev/bosatsu/Shape.scala"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"381218196d666ff843397b8c395435ced42a282a4e7c9edfbafc9bb5299803de"}},{"ruleId":"D2","level":"warning","message":{"text":"StringMatcher.compileLeadingStringSearchSegmentWithLiteral (cognitive 46): StringMatcher.compileLeadingStringSearchSegmentWithLiteral has cognitive complexity 46 (threshold 15). Drivers by points: loops 8 (34 pts), match/switch 2 (7 pts), if/else 5 (nesting depth added 31). 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4561}}}],"partialFingerprints":{"codehealthFindingId/v1":"de9dda50f6f9bff35e37c742cbbfb90a6e2b8fa5d995e546648e437611dc35a7"}},{"ruleId":"D2","level":"warning","message":{"text":"SelfCallKind.applyWithMode (cognitive 46): SelfCallKind.applyWithMode has cognitive complexity 46 (threshold 15). Drivers by points: if/else 24 (42 pts), match/switch 2 (4 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":"core/src/main/scala/dev/bosatsu/SelfCallKind.scala"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"430917120640df42fe3bb48748134bf5dcbd5839a34e97d042fd28c6c0403c68"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonCommand.opts (cognitive 46): JsonCommand.opts has cognitive complexity 46 (threshold 15). Drivers by points: match/switch 15 (37 pts), if/else 8 (9 pts) (nesting depth added 23). 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":"core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"3786fc9db60bcf463dc4e74d37b0c0b6a23be14dd8b18507ccb333493c23e5a6"}},{"ruleId":"D2","level":"warning","message":{"text":"StringMatcher.compileLeadingStringSearchSegmentWithChars (cognitive 45): StringMatcher.compileLeadingStringSearchSegmentWithChars has cognitive complexity 45 (threshold 15). Drivers by points: loops 9 (43 pts), if/else 2 (nesting depth added 34). 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4483}}}],"partialFingerprints":{"codehealthFindingId/v1":"7811a495eb321cbafe6a1f014ee02f9b40216c4e4db9ad257b5d6d14a8c7c7ee"}},{"ruleId":"D2","level":"warning","message":{"text":"PackageCustoms.allImportsAreUsed (cognitive 45): PackageCustoms.allImportsAreUsed has cognitive complexity 45 (threshold 15). Drivers by points: loops 8 (20 pts), match/switch 5 (16 pts), if/else 5 (6 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":"core/src/main/scala/dev/bosatsu/PackageCustoms.scala"},"region":{"startLine":401}}}],"partialFingerprints":{"codehealthFindingId/v1":"859cfb15cc7fc0a02e52b1951857b2fbc66d6e14e6b06a04edf0f1c4b0172976"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.eqTypedExpr (cognitive 45): TypedExpr.eqTypedExpr has cognitive complexity 45 (threshold 15). Drivers by points: boolean chains 24, if/else 7 (8 pts), match/switch 5 (8 pts), loops 2 (5 pts) (nesting depth added 7). 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac80fb86268275b58ff9c43fa0c1ab506b114b1ef4756679b29727453bf3bdd"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprLoopRecurLowering.lowerExpr (cognitive 45): TypedExprLoopRecurLowering.lowerExpr has cognitive complexity 45 (threshold 15). Drivers by points: if/else 24 (37 pts), boolean chains 5, match/switch 2 (3 pts) (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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":879}}}],"partialFingerprints":{"codehealthFindingId/v1":"29ed1c6d62046da8d1888095fb0106958378235d29be132c9c936f37a7a4c095"}},{"ruleId":"D2","level":"warning","message":{"text":"DepsCommand.opts (cognitive 45): DepsCommand.opts has cognitive complexity 45 (threshold 15). Drivers by points: loops 11 (45 pts) (nesting depth added 34). 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":"core/src/main/scala/dev/bosatsu/tool_command/DepsCommand.scala"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8decd41d31d6d5b708729a943108ce17b2263bc6bf1a246fac4d005256a3208"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.boolToValue (cognitive 43): Env.boolToValue has cognitive complexity 43 (threshold 15). Drivers by points: match/switch 9 (21 pts), if/else 9 (12 pts), loops 4 (10 pts) (nesting depth added 21). 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":509}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8ab39fc2f3f5bd578fcbcee67f2ce20c9b720add32bd2358728ce2a80544597"}},{"ruleId":"D2","level":"warning","message":{"text":"DecodedLibrary.decodeWithDeps (cognitive 43): DecodedLibrary.decodeWithDeps has cognitive complexity 43 (threshold 15). Drivers by points: loops 10 (31 pts), match/switch 3 (7 pts), if/else 2 (5 pts) (nesting depth added 28). 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":"core/src/main/scala/dev/bosatsu/library/DecodedLibrary.scala"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb6cc9a5cbbd9fc2b47b268a6ad9e7b237afea43fef9ae33b81157bc5ef27420"}},{"ruleId":"D2","level":"warning","message":{"text":"UnusedLetCheck.loop (cognitive 42): UnusedLetCheck.loop has cognitive complexity 42 (threshold 15). Drivers by points: match/switch 7 (20 pts), if/else 8 (15 pts), loops 3 (7 pts) (nesting depth added 24). 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":"core/src/main/scala/dev/bosatsu/UnusedLetCheck.scala"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f340b69c3cb4f6b9df35b7c4418878945b1ed511c63df07d261517bdacbe1a"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.referencesBindable (cognitive 41): Expr.referencesBindable has cognitive complexity 41 (threshold 15). Drivers by points: if/else 22 (31 pts), match/switch 5 (9 pts), boolean chains 1 (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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"757ff8e13762f9db9698a6a0f412a266f98e78b401ec96ff0b382ed605a14038"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.read_utf8_chunk (cognitive 41): PredefImpl.read_utf8_chunk has cognitive complexity 41 (threshold 15). Drivers by points: match/switch 4 (21 pts), if/else 9 (14 pts), loops 1 (5 pts), boolean chains 1 (nesting depth added 26). 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":1632}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5447ca40d34ab9f3df6602256a019e5ee5c7cd44758e714b0251e6a21f9a781"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.quantify (cognitive 41): TypedExpr.quantify has cognitive complexity 41 (threshold 15). Drivers by points: loops 7 (18 pts), match/switch 10 (15 pts), if/else 7 (8 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2640}}}],"partialFingerprints":{"codehealthFindingId/v1":"dba16d8342a6ae37f316578657226459143e71d96c5c3e613f6949224ab9554e"}},{"ruleId":"D2","level":"warning","message":{"text":"SetOps.product (cognitive 41): SetOps.product has cognitive complexity 41 (threshold 15). Drivers by points: loops 4 (16 pts), if/else 13 (14 pts), match/switch 5 (9 pts), boolean chains 2 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/set/SetOps.scala"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"24cadd1449d008595726ac5f7aedc401fe8e23f131b2468e6c8c7aa1f9f33eed"}},{"ruleId":"D2","level":"warning","message":{"text":"EvalBenchmarkMain.buildBenchFns (cognitive 40): EvalBenchmarkMain.buildBenchFns has cognitive complexity 40 (threshold 15). Drivers by points: loops 8 (36 pts), match/switch 1 (3 pts), if/else 1 (nesting depth added 30). 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":"cli/src/main/scala/dev/bosatsu/EvalBenchmarkMain.scala"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"31c0f1bac43f7038c58cac957f551fb056847fcd44d2fd402bd745e9448da40d"}},{"ruleId":"D2","level":"warning","message":{"text":"Declaration.toDoc (cognitive 40): Declaration.toDoc has cognitive complexity 40 (threshold 15). Drivers by points: match/switch 11 (21 pts), if/else 14 (18 pts), boolean chains 1 (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":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"f976d4c123091700a9fd582a20f24ed991e1be39b912b13bf4a7924086f97587"}},{"ruleId":"D2","level":"warning","message":{"text":"Analyzer.checkType (cognitive 40): Analyzer.checkType has cognitive complexity 40 (threshold 15). Drivers by points: if/else 13 (31 pts), match/switch 3 (7 pts), boolean chains 2 (nesting depth added 22). 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":"core/src/main/scala/dev/bosatsu/Inhabitedness.scala"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"f95853eb1930a36b2c62daefac633ca117714d354e7f98cf04b19ad7da85b747"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.core_read_utf8_impl (cognitive 40): PredefImpl.core_read_utf8_impl has cognitive complexity 40 (threshold 15). Drivers by points: if/else 8 (19 pts), match/switch 3 (11 pts), loops 4 (10 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2464}}}],"partialFingerprints":{"codehealthFindingId/v1":"c49c6a5a99fd3f0f5537bfdef5dcab183fc60a137e44ce91f2dd907e8ffb2ea1"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.undistribute (cognitive 40): Expr.undistribute has cognitive complexity 40 (threshold 15). Drivers by points: if/else 20 (36 pts), match/switch 2 (4 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1093}}}],"partialFingerprints":{"codehealthFindingId/v1":"c080b79356a46599f70446be7dd96a0b047106c858229840b02f57304c508a8d"}},{"ruleId":"D2","level":"warning","message":{"text":"Type.substituteVar (cognitive 40): Type.substituteVar has cognitive complexity 40 (threshold 15). Drivers by points: match/switch 7 (28 pts), if/else 8 (12 pts) (nesting depth added 25). 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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"be26b0d6dbc9c35ba2ef4afdfcc064c1033bf55db4ac93fc53e5d97db035c29a"}},{"ruleId":"D2","level":"warning","message":{"text":"Matchless.inlineApplyArgs (cognitive 39): Matchless.inlineApplyArgs has cognitive complexity 39 (threshold 15). Drivers by points: match/switch 15 (25 pts), if/else 8 (10 pts), boolean chains 4 (nesting depth added 12). 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1428}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ff37391da8926207bb45f0696044b37b2ddaa7d38dd2dd56ba94bca7f151b94"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.referencesLocalAnon (cognitive 39): Expr.referencesLocalAnon has cognitive complexity 39 (threshold 15). Drivers by points: if/else 21 (30 pts), match/switch 5 (9 pts) (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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c773f62f7fbe1c8889a957fe11f9ac2ed25709134cb776fafbd00fa39879ea2"}},{"ruleId":"D2","level":"warning","message":{"text":"StringMatcher.compileFinalStringSearchSegmentWithLiteral (cognitive 39): StringMatcher.compileFinalStringSearchSegmentWithLiteral has cognitive complexity 39 (threshold 15). Drivers by points: loops 6 (21 pts), match/switch 3 (13 pts), if/else 5 (nesting depth added 25). 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4779}}}],"partialFingerprints":{"codehealthFindingId/v1":"7512063722e57d59d5e4d827c3fdb9fd9daa7f93b7586eb02731a50405146258"}},{"ruleId":"D2","level":"warning","message":{"text":"Stack.stackOrder (cognitive 39): Stack.stackOrder has cognitive complexity 39 (threshold 15). Drivers by points: match/switch 9 (26 pts), if/else 9 (13 pts) (nesting depth added 21). 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1421}}}],"partialFingerprints":{"codehealthFindingId/v1":"29131f7b356024a9a89b02defef76ce45b46d95c6d906e6c3659b6ee20e563ad"}},{"ruleId":"D2","level":"warning","message":{"text":"KindFormula.solveAliasKinds (cognitive 38): KindFormula.solveAliasKinds has cognitive complexity 38 (threshold 15). Drivers by points: loops 8 (36 pts), match/switch 1 (2 pts) (nesting depth added 29). 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":"core/src/main/scala/dev/bosatsu/KindFormula.scala"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"7caa13e0db407e6932020574aaa9892e69711695c9f2231700319a3e7a1b0b23"}},{"ruleId":"D2","level":"warning","message":{"text":"StringMatcher.compileFinalStringSearchSegmentWithChars (cognitive 37): StringMatcher.compileFinalStringSearchSegmentWithChars has cognitive complexity 37 (threshold 15). Drivers by points: loops 7 (28 pts), match/switch 1 (7 pts), if/else 2 (nesting depth added 27). 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4702}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d04c08a990a6c258a8743fa22e9aa692a78b44575c905d88789f6b5387fb173"}},{"ruleId":"D2","level":"warning","message":{"text":"MemoryMain.memoryPlatformIO (cognitive 37): MemoryMain.memoryPlatformIO has cognitive complexity 37 (threshold 15). Drivers by points: if/else 16, match/switch 15 (16 pts), loops 2 (5 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":"core/src/main/scala/dev/bosatsu/MemoryMain.scala"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9b951e9b5d822dc616e40ef59ae8f025cb26a27556a4d01b4589623325f3068"}},{"ruleId":"D2","level":"warning","message":{"text":"CompilerApi.typeCheckDiagnostics (cognitive 37): CompilerApi.typeCheckDiagnostics has cognitive complexity 37 (threshold 15). Drivers by points: loops 5 (15 pts), match/switch 3 (13 pts), if/else 3 (8 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":"core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8db6422f9df0a8a9a011741aaa3ed4838558c618a933138c952e1380e9afecf"}},{"ruleId":"D2","level":"warning","message":{"text":"ProtoConverter.definedTypeFromProto (cognitive 36): ProtoConverter.definedTypeFromProto has cognitive complexity 36 (threshold 15). Drivers by points: loops 8 (24 pts), if/else 4 (11 pts), match/switch 1 (nesting depth added 23). 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":1533}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0bab61274b06b6b083e2064565b3a777abfa5f28b505fecc1fceb9f3db48bf4"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.core_write_utf8_impl (cognitive 35): PredefImpl.core_write_utf8_impl has cognitive complexity 35 (threshold 15). Drivers by points: match/switch 4 (13 pts), error handling 2 (10 pts), if/else 3 (6 pts), 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2499}}}],"partialFingerprints":{"codehealthFindingId/v1":"63cdbfe8729a2d3dfcf762bc0706c86136e6d60ba5fa4e331d59a66b7034b652"}},{"ruleId":"D2","level":"warning","message":{"text":"ProtoConverter.referantFromProto (cognitive 35): ProtoConverter.referantFromProto has cognitive complexity 35 (threshold 15). Drivers by points: loops 4 (18 pts), match/switch 5 (10 pts), if/else 2 (7 pts) (nesting depth added 24). 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":1808}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b56ef00e2873f94da5f9aa7d44c2e09e1fd4d90a44ffe624d7d525b3f4399ab"}},{"ruleId":"D2","level":"warning","message":{"text":"VendoredDeps.publishDependency (cognitive 35): VendoredDeps.publishDependency has cognitive complexity 35 (threshold 15). Drivers by points: loops 7 (28 pts), match/switch 1 (7 pts) (nesting depth added 27). 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":"core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"89313f6e1bf5fcd29276b776048c11416e3467e7ab966c78e954e048dd741481"}},{"ruleId":"D2","level":"warning","message":{"text":"NameMap.alignSubsumedPatternNameTargets (cognitive 35): NameMap.alignSubsumedPatternNameTargets has cognitive complexity 35 (threshold 15). Drivers by points: loops 9 (27 pts), match/switch 3 (4 pts), if/else 3, boolean chains 1 (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":"core/src/main/scala/dev/bosatsu/pattern/NameMap.scala"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"32fc254672fa9ad15b4f7ced64e4bc1f6e1303291fd66edea1620ab5c0105074"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceConverter.unTuplePattern (cognitive 34): SourceConverter.unTuplePattern has cognitive complexity 34 (threshold 15). Drivers by points: match/switch 9 (21 pts), if/else 6 (13 pts) (nesting depth added 19). 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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":1987}}}],"partialFingerprints":{"codehealthFindingId/v1":"f64774deec14401cec79f1c8038b926f53199d72c1a81c11502803e65587204b"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.checkApply (cognitive 34): Impl.checkApply has cognitive complexity 34 (threshold 15). Drivers by points: match/switch 7 (24 pts), if/else 7 (10 pts) (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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":3391}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd57a9fc8f96f688ffd8b50fb7a11a7d7308b78276c8a67b58c405f0eab00b68"}},{"ruleId":"D2","level":"warning","message":{"text":"Code.simplifyTernary (cognitive 34): Code.simplifyTernary has cognitive complexity 34 (threshold 15). Drivers by points: if/else 13 (26 pts), match/switch 2 (6 pts), boolean chains 2 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"b727f102235413889ceaf997d9d9adc734e00fd5b2738c0bcd8a954bcfa6c808"}},{"ruleId":"D2","level":"warning","message":{"text":"DecodedLibraryWithDeps.decodedLibraryWithDepsCompilationSource (cognitive 34): DecodedLibraryWithDeps.decodedLibraryWithDepsCompilationSource has cognitive complexity 34 (threshold 15). Drivers by points: loops 8 (21 pts), if/else 7, match/switch 5 (6 pts) (nesting depth added 14). 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":"core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"883c796ea79e3c1d1c10f3d93108ea98cf0eca49a889a8cb71d896c8a1ada26c"}},{"ruleId":"D2","level":"warning","message":{"text":"RuntimeCommandSupport.packMap (cognitive 34): RuntimeCommandSupport.packMap has cognitive complexity 34 (threshold 15). Drivers by points: loops 6 (21 pts), if/else 2 (6 pts), match/switch 1 (6 pts), boolean chains 1 (nesting depth added 24). 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":"core/src/main/scala/dev/bosatsu/tool_command/RuntimeCommandSupport.scala"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"788ba0d8e9208ac4a05da843ab7ffbdea63720b2938486ede96f38d21088082f"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprNormalization.unshadowInlineBinders (cognitive 33): TypedExprNormalization.unshadowInlineBinders has cognitive complexity 33 (threshold 15). Drivers by points: if/else 18 (27 pts), boolean chains 5, 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e0c55869d59f24c55ae26a99aa29db5f528d57be26574817ef9e47aaf74dcf9"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprNormalization.sinkLetIntoBranchingBody (cognitive 33): TypedExprNormalization.sinkLetIntoBranchingBody has cognitive complexity 33 (threshold 15). Drivers by points: boolean chains 16, if/else 9 (16 pts), 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1451}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a9f6ea7e4b84df617369cf701ad7247aea35c2fb60536880eefd79cff67efc6"}},{"ruleId":"D2","level":"warning","message":{"text":"SeqPart.part1SetOps (cognitive 33): SeqPart.part1SetOps has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (19 pts), match/switch 11 (14 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":"core/src/main/scala/dev/bosatsu/pattern/SeqPart.scala"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae553cb3f6d0ce2193655c0d1d88caebcb860a90ad9d0117a7488c8ac2170169"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.unifyUnboundVar (cognitive 33): Impl.unifyUnboundVar has cognitive complexity 33 (threshold 15). Drivers by points: if/else 14 (28 pts), match/switch 2 (5 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1253}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaea8d40094c1c8a41768ec9ac7d901d0754a9365d53d63970289ea2e5644373"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeDefinedType (cognitive 33): ShowEdn.decodeDefinedType has cognitive complexity 33 (threshold 15). Drivers by points: loops 5 (20 pts), match/switch 3 (12 pts), if/else 1 (nesting depth added 24). 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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1041}}}],"partialFingerprints":{"codehealthFindingId/v1":"70feed6d9d2e5c26082a8b2e2730084053640ad595e7ef13449cf733a1662dc9"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.core_create_temp_file_impl (cognitive 32): PredefIoCorePlatform.core_create_temp_file_impl has cognitive complexity 32 (threshold 15). Drivers by points: loops 6 (21 pts), if/else 4 (11 pts) (nesting depth added 22). 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":893}}}],"partialFingerprints":{"codehealthFindingId/v1":"54aec0ed2d6496416e881152824209f620627859839273735999943ecbfdae67"}},{"ruleId":"D2","level":"warning","message":{"text":"ProtoConverter.buildExprs (cognitive 32): ProtoConverter.buildExprs has cognitive complexity 32 (threshold 15). Drivers by points: match/switch 10 (18 pts), if/else 5 (7 pts), loops 2 (7 pts) (nesting depth added 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. 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"20ba19a36a724d56531f19052a75fefb38fe0f892f3fbcc944db7253590cb10e"}},{"ruleId":"D2","level":"warning","message":{"text":"IntAlgebraic.optimize (cognitive 31): IntAlgebraic.optimize has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (14 pts), match/switch 10 (13 pts), loops 1 (3 pts), boolean chains 1 (nesting depth added 8). 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":3269}}}],"partialFingerprints":{"codehealthFindingId/v1":"808ea72273bbfa06fb155cc8e90fab44f86bc4a3d66a31e1edb7657b338f43dd"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.renderTop (cognitive 31): Env.renderTop has cognitive complexity 31 (threshold 15). Drivers by points: loops 8 (29 pts), if/else 1, match/switch 1 (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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":1206}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b00786abe083942800c409fe413acb5e07573f53ef319ef1c434d186968b1a6"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.matches (cognitive 31): Impl.matches has cognitive complexity 31 (threshold 15). Drivers by points: if/else 6 (11 pts), match/switch 5 (11 pts), loops 3 (9 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":"core/src/main/scala/dev/bosatsu/pattern/NamedSeqPattern.scala"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"8665147f509c6cf200510196680a85ca3e2e27258456dc8f8c84657fa678861d"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeConstructorFn (cognitive 31): ShowEdn.decodeConstructorFn has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 4 (15 pts), loops 4 (14 pts), if/else 2 (nesting depth added 21). 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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":961}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c83dd8378f5ae1b229d6b5597ab3f0f7981418c07791c02666ad170aba33f57"}},{"ruleId":"D2","level":"warning","message":{"text":"Json.toDocStackSafe (cognitive 30): Json.toDocStackSafe has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (20 pts), match/switch 3 (8 pts), boolean chains 1, loops 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":"core/src/main/scala/dev/bosatsu/Json.scala"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"721455c4e83d80f04f948230e795da635245892909b6c304590589b6f4d6d285"}},{"ruleId":"D2","level":"warning","message":{"text":"StringMatcher.searchStringWithCharRest (cognitive 30): StringMatcher.searchStringWithCharRest has cognitive complexity 30 (threshold 15). Drivers by points: loops 7 (28 pts), if/else 2 (nesting depth added 21). 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4952}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac5d04d7e75ac0e331b6cfbaabb21325e8832c5dcf6a24c4d8ebcedfd83fbadf"}},{"ruleId":"D2","level":"warning","message":{"text":"SumProd.normalize (cognitive 30): SumProd.normalize has cognitive complexity 30 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 6 (15 pts) (nesting depth added 16). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":2090}}}],"partialFingerprints":{"codehealthFindingId/v1":"3866e4e762e10f3c872c61c48d8c3adf11c205ec6c144fba5ee8b46b2f60b000"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprLoopRecurLowering.isMonomorphicRecursiveBinding (cognitive 30): TypedExprLoopRecurLowering.isMonomorphicRecursiveBinding has cognitive complexity 30 (threshold 15). Drivers by points: boolean chains 15, if/else 7 (11 pts), match/switch 3 (4 pts) (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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff2a3b2e49754b80885bebb7b408d64e292f19cd69fffc77a15f148e3140e0f0"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExprNormalization.hasEscapingFnRef (cognitive 30): TypedExprNormalization.hasEscapingFnRef has cognitive complexity 30 (threshold 15). Drivers by points: boolean chains 15, if/else 7 (12 pts), loops 1 (2 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1185}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4345d32d24217f72bf7520b0bbf3dd3176116d5b696399bdad8f5c6b1d17ac5"}},{"ruleId":"D2","level":"warning","message":{"text":"Output.ccConfOpt (cognitive 30): Output.ccConfOpt has cognitive complexity 30 (threshold 15). Drivers by points: loops 8 (21 pts), match/switch 4 (9 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangTranspiler.scala"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fa9fd5da60ce4b430e2401df8e77c1ede35743af06508c3c33b3308fb6de39d"}},{"ruleId":"D2","level":"warning","message":{"text":"CodeGenerator.resolveFieldType (cognitive 30): CodeGenerator.resolveFieldType has cognitive complexity 30 (threshold 15). Drivers by points: if/else 23 (26 pts), match/switch 1 (3 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":"core/src/main/scala/dev/bosatsu/protobuf/CodeGenerator.scala"},"region":{"startLine":434}}}],"partialFingerprints":{"codehealthFindingId/v1":"577827496692498ebed2a86e565c39f2bdd4015dd6e6fb76499f20670c6e10a7"}},{"ruleId":"D2","level":"warning","message":{"text":"PackageMap.resolvePackages (cognitive 29): PackageMap.resolvePackages has cognitive complexity 29 (threshold 15). Drivers by points: match/switch 9 (17 pts), if/else 4 (9 pts), error handling 1 (2 pts), loops 1 (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":"core/src/main/scala/dev/bosatsu/PackageMap.scala"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d01f2350a97f4d9a08139ea5ad2ea7c0c7de9fa28683f19736671d09487bfc"}},{"ruleId":"D2","level":"warning","message":{"text":"SumProd.splits (cognitive 29): SumProd.splits has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (15 pts), match/switch 6 (12 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1953}}}],"partialFingerprints":{"codehealthFindingId/v1":"5463cadde62a45a4d7fa84f71743c6314b25e33ff42228eb36b3cf3189a6781a"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceConverter.makeLetsUnique (cognitive 29): SourceConverter.makeLetsUnique has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (19 pts), match/switch 4 (10 pts) (nesting depth added 16). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2944}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d6218ceea80841e9d0a7e40b8caae97ebd55d614d91ee18626c6020c11eecdd"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeValidator.patternBindingTypes (cognitive 29): TypeValidator.patternBindingTypes has cognitive complexity 29 (threshold 15). Drivers by points: if/else 13 (17 pts), match/switch 7 (12 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":"core/src/main/scala/dev/bosatsu/TypeValidator.scala"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3762971eefa346732ac13c29aeb4e9bb124a438298a1faf55f7c87f7836d3a"}},{"ruleId":"D2","level":"warning","message":{"text":"ResolveToLambda.unapply (cognitive 29): ResolveToLambda.unapply has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (16 pts), match/switch 6 (13 pts) (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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2249}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d4509f815aca60ff00bdae3b35bf59971d1033f40398887847c67315238b66"}},{"ruleId":"D2","level":"warning","message":{"text":"Ops.boolExpr (cognitive 29): Ops.boolExpr has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (15 pts), match/switch 8 (13 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":"core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala"},"region":{"startLine":3308}}}],"partialFingerprints":{"codehealthFindingId/v1":"00a8f8d51572df7e48fa306d5a6b34342e94b165d650cab8c5515d02b5752877"}},{"ruleId":"D2","level":"warning","message":{"text":"Kind.kinds (cognitive 28): Kind.kinds has cognitive complexity 28 (threshold 15). Drivers by points: match/switch 6 (16 pts), if/else 5 (7 pts), loops 2 (5 pts) (nesting depth added 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. 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":"core/src/main/scala/dev/bosatsu/Kind.scala"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"23ca081a953a7a1a43eec6808042ab68c1b7839be8d668fc820d653acefa7e12"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.loop (cognitive 28): Env.loop has cognitive complexity 28 (threshold 15). Drivers by points: match/switch 6 (14 pts), if/else 7 (11 pts), loops 1 (2 pts), boolean chains 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":"core/src/main/scala/dev/bosatsu/MatchlessToValue.scala"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"47bcaae676e6d90387961d0f8c22ac41224539a806a0c25a2869fe1c8489e9e1"}},{"ruleId":"D2","level":"warning","message":{"text":"ProtoConverter.packageToProto (cognitive 28): ProtoConverter.packageToProto has cognitive complexity 28 (threshold 15). Drivers by points: loops 7 (28 pts) (nesting depth added 21). 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":2032}}}],"partialFingerprints":{"codehealthFindingId/v1":"27a21af89700c8a526254fd91512c5a59ffa336ad5a154369d6f4cc8a2ca07c5"}},{"ruleId":"D2","level":"warning","message":{"text":"Test.values (cognitive 28): Test.values has cognitive complexity 28 (threshold 15). Drivers by points: match/switch 8 (20 pts), if/else 4 (8 pts) (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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangTranspiler.scala"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"86cb31c957f1a311e9067a599d3e7d48850b65c83bdb5cebb4776329c1222576"}},{"ruleId":"D2","level":"warning","message":{"text":"Relatable.listUnion (cognitive 28): Relatable.listUnion has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (14 pts), loops 3 (9 pts), match/switch 3 (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":"core/src/main/scala/dev/bosatsu/set/Relatable.scala"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"8802e1a1fe30522e78bd9a34654ca39bc3a73af191f404685c2884abfc87115c"}},{"ruleId":"D2","level":"warning","message":{"text":"Output.report (cognitive 28): Output.report has cognitive complexity 28 (threshold 15). Drivers by points: match/switch 8 (17 pts), if/else 7 (10 pts), boolean chains 1 (nesting depth added 12). 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":"core/src/main/scala/dev/bosatsu/tool/Output.scala"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f218902ea459a9e241e1d6c17ab889a981b5a867a30beaddbeb1fbbd6b72e42d"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowCommand.opts (cognitive 28): ShowCommand.opts has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 4 (10 pts), match/switch 1 (5 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":"core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ac89932749dda8d9c835217b0ed226fa5265c22ff9e4a2f866c77fbbdd43abc"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.writeNodeBuffer (cognitive 27): PredefIoCorePlatform.writeNodeBuffer has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (14 pts), error handling 3 (9 pts), loops 1 (3 pts), 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e430d40f8bac6dccc491e861d0a6a0c8dab73ac1e6851a8689f8855e108466a"}},{"ruleId":"D2","level":"warning","message":{"text":"Matchless.substituteBindables (cognitive 27): Matchless.substituteBindables has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (15 pts), match/switch 5 (12 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1130}}}],"partialFingerprints":{"codehealthFindingId/v1":"188dfb6f3685f5ef84ea332a919966c72b934f4b21b4018bc771a0b9949330d5"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.core_read_all_bytes_impl (cognitive 27): PredefImpl.core_read_all_bytes_impl has cognitive complexity 27 (threshold 15). Drivers by points: if/else 3 (10 pts), loops 4 (9 pts), match/switch 2 (7 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2355}}}],"partialFingerprints":{"codehealthFindingId/v1":"9307d301db2507aa5a994d0d5861ae7cb0d5807b7111b10ae5aaca896e13713d"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.find_Bytes (cognitive 27): PredefImpl.find_Bytes has cognitive complexity 27 (threshold 15). Drivers by points: if/else 10 (18 pts), loops 2 (7 pts), boolean chains 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":4211}}}],"partialFingerprints":{"codehealthFindingId/v1":"041070efd8801a26d0f16e087f853299dfb66717aaa69ee851a303334e19e663"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceConverter.toEnumDefinition (cognitive 27): SourceConverter.toEnumDefinition has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15 (16 pts), match/switch 6 (7 pts), boolean chains 4 (nesting depth added 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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":1630}}}],"partialFingerprints":{"codehealthFindingId/v1":"5da34072621fc1d4d8f50df57288cbb8279a8b919c9052be545b9444d6c7b798"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeValidator.normalizeTypeForValidation (cognitive 27): TypeValidator.normalizeTypeForValidation has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (21 pts), match/switch 3 (5 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":"core/src/main/scala/dev/bosatsu/TypeValidator.scala"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"f721c99fc6a329b356c228a879ed35c51056506402530c97ebd63c38ae6e5a0a"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.coerceRho (cognitive 27): TypedExpr.coerceRho has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 7 (22 pts), if/else 5 (nesting depth added 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. 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3408}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a0b2dd15c150354684a6c04bd624d829c926a3e102a6f7c6d271980bbdce3c"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeTypeAlias (cognitive 27): ShowEdn.decodeTypeAlias has cognitive complexity 27 (threshold 15). Drivers by points: loops 5 (20 pts), match/switch 2 (6 pts), if/else 1 (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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1090}}}],"partialFingerprints":{"codehealthFindingId/v1":"41ee12037d9fdf49482201d66f76d3bc3b45acdc467b407edc95c6ab6b95a23d"}},{"ruleId":"D2","level":"warning","message":{"text":"GenericStringUtil.unescape (cognitive 26): GenericStringUtil.unescape has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (15 pts), match/switch 2 (9 pts), error handling 1 (2 pts) (nesting depth added 11). 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":"core/src/main/scala/dev/bosatsu/StringUtil.scala"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cc308152d7e93a2f0166b072833537e5c94406b6777840406f6381b57f94207"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.unshadowBranch (cognitive 26): TypedExpr.unshadowBranch has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (18 pts), match/switch 6 (8 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3733}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa69703e747675740294e28ad99f4923c0b09a4faa6ec3f2866f8b40c6d49169"}},{"ruleId":"D2","level":"warning","message":{"text":"TestCommand.opts (cognitive 26): TestCommand.opts has cognitive complexity 26 (threshold 15). Drivers by points: if/else 6 (13 pts), match/switch 2 (7 pts), loops 3 (6 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":"core/src/main/scala/dev/bosatsu/tool_command/TestCommand.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e165697bf34d48465a7ff7ff6244b58ceb5949639f2da4d6b21d2f134deb33d"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.readNodeBytes (cognitive 25): PredefIoCorePlatform.readNodeBytes has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (16 pts), error handling 2 (6 pts), match/switch 2 (3 pts) (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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"533bef549ca991abc845e5188f6ddf54e2f468406d5a2add3d70f6b3ef70da38"}},{"ruleId":"D2","level":"warning","message":{"text":"State.kindOfType (cognitive 25): State.kindOfType has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 5 (12 pts), loops 2 (9 pts), if/else 2 (3 pts), boolean chains 1 (nesting depth added 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. 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":"core/src/main/scala/dev/bosatsu/KindFormula.scala"},"region":{"startLine":861}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ea542955c84233220552e2b4356eb7db60c28b725160e15af59cf2a29cb7a5a"}},{"ruleId":"D2","level":"warning","message":{"text":"Matchless.sinkBranchOnlyLets (cognitive 25): Matchless.sinkBranchOnlyLets has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (16 pts), match/switch 4 (5 pts), boolean chains 4 (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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":2909}}}],"partialFingerprints":{"codehealthFindingId/v1":"69c7600078cc77a253eb6fd8364100b2afda8d87749e302c1c99cb7091380766"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.maybeDivInt (cognitive 25): Expr.maybeDivInt has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (15 pts), match/switch 3 (10 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"27878478d50919866cb5ae2f442a3be225ec9fda7faf536cbfa0798cbf4c3cd9"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceConverter.toProgram (cognitive 25): SourceConverter.toProgram has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 7 (18 pts), if/else 2 (4 pts), loops 2 (3 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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2789}}}],"partialFingerprints":{"codehealthFindingId/v1":"e55da97940928e71bc5dcb83f480710499ef504816690c66baa6418c56919727"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeParser.toDoc (cognitive 25): TypeParser.toDoc has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 12 (21 pts), if/else 3 (4 pts) (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":"core/src/main/scala/dev/bosatsu/TypeParser.scala"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"373dc725c67d117df76ecda183c9b5cd400e7fcb2df2c43b70abcc0cb830948c"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.substituteTypeVar (cognitive 25): TypedExpr.substituteTypeVar has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 2 (7 pts), match/switch 2 (5 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3843}}}],"partialFingerprints":{"codehealthFindingId/v1":"40b6cca68313da4aa4e8d8e62c6f776d3a1cd9b03d1f4d643d2428dd555c5f18"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.normalizeAliasesDeep (cognitive 25): Env.normalizeAliasesDeep has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (21 pts), match/switch 1 (3 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2cff1576e972025ec9cf766e5f5144c360b30b336ad72b827f1594d8d4ef84a"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeType (cognitive 25): ShowEdn.decodeType has cognitive complexity 25 (threshold 15). Drivers by points: loops 8 (23 pts), if/else 1, match/switch 1 (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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"326a5322e269fbb326f8f8fc8379b2582d34ae0153a521f399f04b4729a2fc50"}},{"ruleId":"D2","level":"warning","message":{"text":"Pattern.document (cognitive 24): Pattern.document has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 9 (18 pts), if/else 4 (5 pts), boolean chains 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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":1117}}}],"partialFingerprints":{"codehealthFindingId/v1":"c45fa6f9ddec4b12a3b6355b13ad19f313dc983dde59ce7fcb010bbfb8770761"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.toArgsBody (cognitive 24): TypedExpr.toArgsBody has cognitive complexity 24 (threshold 15). Drivers by points: if/else 13 (20 pts), loops 1 (2 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":1563}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6ee06e0b437bf2fd87c83d8b145363c3924714158d773aab4db10d4540d365e"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.substituteAll (cognitive 24): TypedExpr.substituteAll has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (15 pts), match/switch 3 (5 pts), loops 1 (3 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3543}}}],"partialFingerprints":{"codehealthFindingId/v1":"18fe9fb63297c95818383571c02aa5a28a0b00da8da733ebe6b0450e11b50270"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.literal (cognitive 24): Env.literal has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (14 pts), error handling 2 (5 pts), loops 1 (4 pts), 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":749}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a83f2d55a604a416bbe6730e667a69733885070ad07c6b231c8d46d99eb3810"}},{"ruleId":"D2","level":"warning","message":{"text":"Code.simplifyBoolExpr (cognitive 24): Code.simplifyBoolExpr has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16 (21 pts), match/switch 2 (3 pts) (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":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"248b25842710c5072ce49423fc61b2fe36568b076fe8eafa626cb358882dd2b2"}},{"ruleId":"D2","level":"warning","message":{"text":"verify_release_tag.extract_version (cognitive 24): verify_release_tag.extract_version has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (19 pts), loops 3 (5 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/verify_release_tag.py"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"d01afdeee37776e6c59960b020e51fbd2ea440cb61b20b91a423250b52082822"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.core_open_file_impl (cognitive 23): PredefIoCorePlatform.core_open_file_impl has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 3 (6 pts), error handling 1 (4 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a7e97834469ad14d0a61927b7b1ab46e0251d084aadcb20939b970afb8e93cc"}},{"ruleId":"D2","level":"warning","message":{"text":"InSetCompiler.compilePositive (cognitive 23): InSetCompiler.compilePositive has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (18 pts), loops 2 (5 pts) (nesting depth added 15). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/InSetCompiler.scala"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"33ef302a9256eddc618d6817f39f5dc90f0c6a88a4329ec1fefc3c1170201f78"}},{"ruleId":"D2","level":"warning","message":{"text":"KindFormula.solveKind (cognitive 23): KindFormula.solveKind has cognitive complexity 23 (threshold 15). Drivers by points: loops 6 (21 pts), match/switch 1 (2 pts) (nesting depth added 16). 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":"core/src/main/scala/dev/bosatsu/KindFormula.scala"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"86e1bc3e0452d83e7cd63baab58ce15e519b5d1f06d705068d174383dea56937"}},{"ruleId":"D2","level":"warning","message":{"text":"Pattern.filterVars (cognitive 23): Pattern.filterVars has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (18 pts), match/switch 3 (5 pts) (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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7d444e87702126019b0a530198151dbe48e103bdf14a972b6f9211fc0cb9a00"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.core_flush_impl (cognitive 23): PredefImpl.core_flush_impl has cognitive complexity 23 (threshold 15). Drivers by points: error handling 2 (8 pts), match/switch 3 (8 pts), if/else 2 (4 pts), loops 2 (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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2547}}}],"partialFingerprints":{"codehealthFindingId/v1":"314d4013e1d8c70662997f2d80dc7e41cfddd96355b85c594350d7279f7f5d7f"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.prog_core_create_temp_dir (cognitive 23): PredefImpl.prog_core_create_temp_dir has cognitive complexity 23 (threshold 15). Drivers by points: loops 4 (10 pts), match/switch 2 (5 pts), error handling 1 (4 pts), if/else 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3252}}}],"partialFingerprints":{"codehealthFindingId/v1":"6497e5d756d6df9b69b731de24c33bbbcf6b7fb7a5e22bff89d49690e6ad2615"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.filter_Array (cognitive 23): PredefImpl.filter_Array has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (17 pts), loops 2 (5 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":4426}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e7e91de7ae5737a902915950c0473a59b3c429b3bd2daf27304e23876e53c1e"}},{"ruleId":"D2","level":"warning","message":{"text":"SeqPattern.matcher (cognitive 23): SeqPattern.matcher has cognitive complexity 23 (threshold 15). Drivers by points: loops 5 (14 pts), match/switch 4 (6 pts), if/else 2 (3 pts) (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":"core/src/main/scala/dev/bosatsu/pattern/SeqPattern.scala"},"region":{"startLine":698}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f54f30750c4fbf39ca66ca8dbc2e222765d6b5b4ecbfbf4d0c6c6e52c9a0975"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.core_read_all_bytes_impl (cognitive 22): PredefIoCorePlatform.core_read_all_bytes_impl has cognitive complexity 22 (threshold 15). Drivers by points: loops 4 (9 pts), match/switch 2 (7 pts), if/else 2 (5 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"0917e29ef0704e42cb7af0ba39165fc1d0c22e53df4eb1dd6e50231c638da3dc"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.applyViaInst (cognitive 22): Impl.applyViaInst has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 6 (14 pts), if/else 5 (7 pts), boolean chains 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2079}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a69682f785f0081d779fa5f1a08651bcf5293b6d91946723aef5efcd5b82ab2"}},{"ruleId":"D2","level":"warning","message":{"text":"SmtExpr.pathImplies (cognitive 22): SmtExpr.pathImplies has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 4 (8 pts), boolean chains 7, if/else 7 (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":"core/src/main/scala/dev/bosatsu/smt/SmtExpr.scala"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"4699bdc2f473296b28995194ba4282063a5394429d41b685b2306ebd4db99332"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeQuant (cognitive 22): ShowEdn.decodeQuant has cognitive complexity 22 (threshold 15). Drivers by points: loops 5 (20 pts), if/else 1, match/switch 1 (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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":585}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5d17382854b539d057732543a7d7bf703afbe9e29c63b3b46e9a027aa7efdaf"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.core_mkdir_with_mode_impl (cognitive 21): PredefIoCorePlatform.core_mkdir_with_mode_impl has cognitive complexity 21 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 3 (6 pts), error handling 1 (5 pts) (nesting depth added 13). 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":1179}}}],"partialFingerprints":{"codehealthFindingId/v1":"387210c3ebe426c486bafa96fc7b4719071a2cb8905b02547dd62504480e6131"}},{"ruleId":"D2","level":"warning","message":{"text":"Matchless.parameterDemandSummary (cognitive 21): Matchless.parameterDemandSummary has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 5 (10 pts), if/else 6 (9 pts), boolean chains 2 (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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1848}}}],"partialFingerprints":{"codehealthFindingId/v1":"e39ac276b4b2bce7cb17178942d7f02a7ef67d08dba7867667b2caac3609d817"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.prog_core_mkdir_with_mode (cognitive 21): PredefImpl.prog_core_mkdir_with_mode has cognitive complexity 21 (threshold 15). Drivers by points: loops 4 (10 pts), error handling 1 (5 pts), if/else 2 (5 pts), match/switch 1 (nesting depth added 13). 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3412}}}],"partialFingerprints":{"codehealthFindingId/v1":"8359ef875514a42da2e8908fae854b5a9776e5078fac154e8e3ad985b6017c0b"}},{"ruleId":"D2","level":"warning","message":{"text":"Solver.shapeOfType (cognitive 21): Solver.shapeOfType has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 5 (12 pts), loops 3 (9 pts) (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":"core/src/main/scala/dev/bosatsu/Shape.scala"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc15cd2b9d7ae6977785c9d712d06c4b03fdb407e22078d8f1b4c1f703923090"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeValidator.thawRigidWitnesses (cognitive 21): TypeValidator.thawRigidWitnesses has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (15 pts), match/switch 2 (5 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":"core/src/main/scala/dev/bosatsu/TypeValidator.scala"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"a99bd2939765191abdc3897e975dab2c433a9593a1b045544901ae9732c01656"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.evaluate (cognitive 21): Impl.evaluate has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (11 pts), match/switch 5 (10 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2821}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc411ccbf7b0395b1ea9dd1e22089a0248d3843fca462010ec1b66388de08655"}},{"ruleId":"D2","level":"warning","message":{"text":"ResolveToLambda.parameterDemandSummary (cognitive 21): ResolveToLambda.parameterDemandSummary has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (12 pts), match/switch 4 (7 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2333}}}],"partialFingerprints":{"codehealthFindingId/v1":"3232a4979581c874d2045495c79a1dd4e9897d033572f445bf2edcfb5a256c37"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.andCode (cognitive 21): Env.andCode has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (9 pts), match/switch 3 (6 pts), loops 2 (5 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"9035a89ac2139154ba1a8871ac817fa35cd1ef7cf399a5e14004821171f0ace6"}},{"ruleId":"D2","level":"warning","message":{"text":"ValueLike.ifThenElseV (cognitive 21): ValueLike.ifThenElseV has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 4 (10 pts), if/else 4 (6 pts), loops 2 (5 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":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"b69384dbf0ce677818fe06d9d3a13a5f4e512e3b79c7522086aebf986014d819"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefExternal.buildPyStringCmpHelper (cognitive 21): PredefExternal.buildPyStringCmpHelper has cognitive complexity 21 (threshold 15). Drivers by points: loops 6 (21 pts) (nesting depth added 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":"core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala"},"region":{"startLine":826}}}],"partialFingerprints":{"codehealthFindingId/v1":"20101bc1d7b3fbfbb2dcafa206af6f433c83ccd893f0037f35c5dd520471e5a1"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefExternal.makeLambda (cognitive 21): PredefExternal.makeLambda has cognitive complexity 21 (threshold 15). Drivers by points: loops 4 (14 pts), match/switch 1 (4 pts), if/else 3 (nesting depth added 13). 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":"core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala"},"region":{"startLine":3182}}}],"partialFingerprints":{"codehealthFindingId/v1":"67696265cba151f26a96baf2b1498c9f26a72edd2bfae168660f853439ceb059"}},{"ruleId":"D2","level":"warning","message":{"text":"Toposort.sort (cognitive 21): Toposort.sort has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 5 (12 pts), if/else 7 (9 pts) (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":"core/src/main/scala/dev/bosatsu/graph/Toposort.scala"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c9cc82611d2374a880b481b23b0d11dd10d844dd69af9a38292c3be4059dca"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.applyRhoExpect (cognitive 21): Impl.applyRhoExpect has cognitive complexity 21 (threshold 15). Drivers by points: loops 5 (15 pts), match/switch 2 (5 pts), if/else 1 (nesting depth added 13). 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2221}}}],"partialFingerprints":{"codehealthFindingId/v1":"44ad6bc2939a0dda2d623ea7c30ac6e5a6ab2ad0dc8cc2867f1926f6065dfe61"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.instDataCon (cognitive 21): Impl.instDataCon has cognitive complexity 21 (threshold 15). Drivers by points: loops 6 (18 pts), match/switch 2, if/else 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":3208}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef9bc5c6d0ab9d8154a0d7e6513cfd3df0b740ba8b7ac09108dd52acc4e59d45"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowSelection.selectPackages (cognitive 21): ShowSelection.selectPackages has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 3 (9 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":"core/src/main/scala/dev/bosatsu/tool/ShowSelection.scala"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ba80916c31b5dce74bdb5afb8134d36f257b3f7c42548cfcae321677e9898d"}},{"ruleId":"D2","level":"warning","message":{"text":"CheckBenchmarkMain.execute (cognitive 20): CheckBenchmarkMain.execute has cognitive complexity 20 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 2 (6 pts), match/switch 1 (4 pts) (nesting depth added 13). 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":"cli/src/main/scala/dev/bosatsu/CheckBenchmarkMain.scala"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"f54ddfd6715c11d2e29e67848dea4b348963c33be2fffbf14c9f3683bfc63a19"}},{"ruleId":"D2","level":"warning","message":{"text":"Analyzer.evaluateQuantifier (cognitive 20): Analyzer.evaluateQuantifier has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (18 pts), match/switch 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":"core/src/main/scala/dev/bosatsu/Inhabitedness.scala"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1cb686138543ed00da75d4936f329c599a230c37c1006032870d894a72b67ad"}},{"ruleId":"D2","level":"warning","message":{"text":"StringMatcher.matchStringParts (cognitive 20): StringMatcher.matchStringParts has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (14 pts), boolean chains 3, match/switch 2 (3 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":5118}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eddf98558d8073ece717ffca0a95bd4dc67e3dfa595b10ea90d9c419c53e7f0"}},{"ruleId":"D2","level":"warning","message":{"text":"ParserHints.unescapedInterpolationStartBefore (cognitive 20): ParserHints.unescapedInterpolationStartBefore has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (18 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":"core/src/main/scala/dev/bosatsu/ParserHints.scala"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"31c2cd40bb97e182bbfadb97b8afa87be1c772b9c84cbfc8c83577183fb1f569"}},{"ruleId":"D2","level":"warning","message":{"text":"Pattern.collisionBinds (cognitive 20): Pattern.collisionBinds has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 3 (5 pts) (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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"83c9449374c88f91db1ca5e4000d04a278acd28a76d5918b94cac8569bdf1e89"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.addAll (cognitive 20): Expr.addAll has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (17 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":996}}}],"partialFingerprints":{"codehealthFindingId/v1":"a26b561ae13b46e3e7e87e2db0d04149f6ebe4d2168070615b095f19e875462b"}},{"ruleId":"D2","level":"warning","message":{"text":"Ops.makeCons (cognitive 20): Ops.makeCons has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (10 pts), loops 3 (9 pts), match/switch 1 (nesting depth added 8). 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":"core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala"},"region":{"startLine":3258}}}],"partialFingerprints":{"codehealthFindingId/v1":"44dfcde9d8851cc548b799b1a3cd226fdc7fab556fddd887e731e57cdb4ec755"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.unifyFnRho (cognitive 20): Impl.unifyFnRho has cognitive complexity 20 (threshold 15). Drivers by points: loops 3 (12 pts), if/else 5 (7 pts), match/switch 1 (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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1168}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1b8b7cf7c855ceac017a83021b4ca37de77b7d61cf0b17cf4f91f03a64f535c"}},{"ruleId":"D2","level":"warning","message":{"text":"UnionRelModule.unionRelCompare (cognitive 20): UnionRelModule.unionRelCompare has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 5 (17 pts), if/else 3 (nesting depth added 12). 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":"core/src/main/scala/dev/bosatsu/set/Relatable.scala"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"6611360240880214a4a146f2d6e9273e53f518890ff9750860cb64b0562aabb5"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceDocs.fromStatements (cognitive 20): SourceDocs.fromStatements has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 4 (10 pts), if/else 6 (9 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":"core/src/main/scala/dev/bosatsu/tool/MarkdownDoc.scala"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"6211fb25b74a909495f50cc911566c7d18aaf0a00f8e66e7d5f59a261d07fd41"}},{"ruleId":"D2","level":"warning","message":{"text":"MatchlessGlobalInlining.shouldInline (cognitive 19): MatchlessGlobalInlining.shouldInline has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 9 (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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":558}}}],"partialFingerprints":{"codehealthFindingId/v1":"bea2180b7157dd19304576725ce2e0a178475d2afc48308b80cb33a2242e62ef"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.eval_loop_Eval (cognitive 19): PredefImpl.eval_loop_Eval has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 4 (11 pts), if/else 6 (7 pts), 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":1029}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c01c7f6ac6ed6f2399bcd9fed34bb3ea628b49145ece0beca665a71a635911b"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.prog_core_stat (cognitive 19): PredefImpl.prog_core_stat has cognitive complexity 19 (threshold 15). Drivers by points: error handling 6 (15 pts), loops 2 (3 pts), match/switch 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3333}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9affa42dbad832cb2ffdb3d2c48678c7f24f9509c140f1f50cfefb45ed6e48b"}},{"ruleId":"D2","level":"warning","message":{"text":"Weights.multIsBetter (cognitive 19): Weights.multIsBetter has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (14 pts), match/switch 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1605}}}],"partialFingerprints":{"codehealthFindingId/v1":"aefd49fb6e6312ebbba1a34ab58b82fedb51442efee162540c91ab8716ca8370"}},{"ruleId":"D2","level":"warning","message":{"text":"Solver.shapeToKnown (cognitive 19): Solver.shapeToKnown has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 9 (14 pts), if/else 4 (5 pts) (nesting depth added 6). 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":"core/src/main/scala/dev/bosatsu/Shape.scala"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d9c6da9753af2dc44ba2fcc2d1357318762a29a2651e9a6c15f11ceae680caf"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceConverter.toLets (cognitive 19): SourceConverter.toLets has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 7 (10 pts), if/else 6 (9 pts) (nesting depth added 6). 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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2638}}}],"partialFingerprints":{"codehealthFindingId/v1":"c51866f3cb1cfd85ab77c808ded7d5475732ccc695cd621f0389879e59d246d8"}},{"ruleId":"D2","level":"warning","message":{"text":"TypedExpr.instantiateTo (cognitive 19): TypedExpr.instantiateTo has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (12 pts), match/switch 3 (4 pts), boolean chains 3 (nesting depth added 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3162}}}],"partialFingerprints":{"codehealthFindingId/v1":"73307437dee3f8b14f631388b4b80dc2da9dbd455b466745383cf1ce7b4c4be4"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.recurAllowedByLexOrder (cognitive 19): Impl.recurAllowedByLexOrder has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (12 pts), match/switch 2 (4 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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":2894}}}],"partialFingerprints":{"codehealthFindingId/v1":"d15a5fe4d55f26759a0e6a7c929c922d69586edc570f5e09045762cb1774657c"}},{"ruleId":"D2","level":"warning","message":{"text":"DecodedLibrary.publicDepClosure (cognitive 19): DecodedLibrary.publicDepClosure has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (9 pts), match/switch 4 (9 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":"core/src/main/scala/dev/bosatsu/library/DecodedLibrary.scala"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"d09aed35cf2b47bb942810705a40bbd7d99de529f7875a850af570706fab5573"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.skolemize (cognitive 19): Impl.skolemize has cognitive complexity 19 (threshold 15). Drivers by points: loops 3 (12 pts), if/else 3 (4 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":697}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d9b5587a10041bd3f65b2412de31f4ba9554210d62a9c0cae1eda5c5ade16df"}},{"ruleId":"D2","level":"warning","message":{"text":"CompilerApi.typeCheckWithLintMode (cognitive 19): CompilerApi.typeCheckWithLintMode has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 6 (16 pts), loops 2 (3 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":"core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"92217e49daad54b0fc7b74f857de584b09455532385fd3a7a0c73b9cf8af6640"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefIoCorePlatform.core_create_temp_dir_impl (cognitive 18): PredefIoCorePlatform.core_create_temp_dir_impl has cognitive complexity 18 (threshold 15). Drivers by points: loops 4 (10 pts), error handling 1 (4 pts), if/else 2 (4 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":927}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecaf5984129143ac306b4cbe5235944c5888cba4040250f32540998e47cd467d"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.globalRefs (cognitive 18): Expr.globalRefs has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 5 (16 pts), boolean chains 1, 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":"core/src/main/scala/dev/bosatsu/Expr.scala"},"region":{"startLine":913}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfaa75a84d40055e81d6838629964d2ae29a77372f85be303c74793239ce1e71"}},{"ruleId":"D2","level":"warning","message":{"text":"MatchlessGlobalInlining.summarizeValue (cognitive 18): MatchlessGlobalInlining.summarizeValue has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (8 pts), match/switch 4 (7 pts), boolean chains 3 (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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":766}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c98a22450a1fe1f0a590a77d1f976a744d32d99d9811a8df45a02ba5fd7ceb0"}},{"ruleId":"D2","level":"warning","message":{"text":"OperatorHints.compareFns (cognitive 18): OperatorHints.compareFns has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 4 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level. This shape REPEATS in the file: one other method here (OperatorHints.equalityFns) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/OperatorHints.scala"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"95980a05a92397a1dbe77505ba69c1c4c10b11a35ad32d8982b1a7dd17412f42"}},{"ruleId":"D2","level":"warning","message":{"text":"OperatorHints.equalityFns (cognitive 18): OperatorHints.equalityFns has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 4 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level. This shape REPEATS in the file: one other method here (OperatorHints.compareFns) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/OperatorHints.scala"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f2ea7820237d6092481877672d25c8044a713f1ccf8611f514dbec330aea63f"}},{"ruleId":"D2","level":"warning","message":{"text":"PackageMap.resolveAllSourceUnits (cognitive 18): PackageMap.resolveAllSourceUnits has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 3, match/switch 3 (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":"core/src/main/scala/dev/bosatsu/PackageMap.scala"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"505b15c51cf699d0c2973edbf61df4177299dec3ba4c38b0bfb4a7addc5e42ad"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.run_prog (cognitive 18): PredefImpl.run_prog has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 3 (10 pts), loops 3 (7 pts), if/else 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3772}}}],"partialFingerprints":{"codehealthFindingId/v1":"60478c44429c68c8e7d48a7f72639b0ca43405383089f7b18df79585fa515e51"}},{"ruleId":"D2","level":"warning","message":{"text":"ProcessValue.waitForExitCodeTimeout (cognitive 18): ProcessValue.waitForExitCodeTimeout has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (11 pts), error handling 2 (6 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":1800}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa70bb7ce6ff0e6424fbdf0951d4564e0ec2f905f65d86e2c6b921d9063f7878"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.bestEffortConstMult (cognitive 18): Expr.bestEffortConstMult has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (9 pts), match/switch 3 (9 pts) (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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":489}}}],"partialFingerprints":{"codehealthFindingId/v1":"909d7950e3da81a89232a6a3590d3675c653a10aa0cd2dbbb6f1d23246db47c9"}},{"ruleId":"D2","level":"warning","message":{"text":"Stack.maybeBigInt (cognitive 18): Stack.maybeBigInt has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 7 (15 pts), if/else 3 (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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1207}}}],"partialFingerprints":{"codehealthFindingId/v1":"df16f36823e10d2255fe7218c59f00b98cd5b261009eb33908e7230204783057"}},{"ruleId":"D2","level":"warning","message":{"text":"AnnotatedLambda.unshadow (cognitive 18): AnnotatedLambda.unshadow has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (9 pts), match/switch 4 (9 pts) (nesting depth added 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. This shape REPEATS in the file: one other method here (Loop.unshadowBody) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":792}}}],"partialFingerprints":{"codehealthFindingId/v1":"898c70ba875052e30d16299179f1d69bb4944c7b36e801eadd65222c8dee10bc"}},{"ruleId":"D2","level":"warning","message":{"text":"Loop.unshadowBody (cognitive 18): Loop.unshadowBody has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (9 pts), match/switch 4 (9 pts) (nesting depth added 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. This shape REPEATS in the file: one other method here (AnnotatedLambda.unshadow) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"53eb00a190b205fefbf3e4b1b3a09209291b3dd1f365412a14fbf2bcdc30509a"}},{"ruleId":"D2","level":"warning","message":{"text":"InvariantTypedExpr.freeTyVars (cognitive 18): InvariantTypedExpr.freeTyVars has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 10 (13 pts), if/else 2 (3 pts), loops 1 (2 pts) (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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2156}}}],"partialFingerprints":{"codehealthFindingId/v1":"f75fc6146c9fc3ef0898e9c099fbca2513ba097b1266b526125964d69ae5bb9e"}},{"ruleId":"D2","level":"warning","message":{"text":"Code.exprToDoc (cognitive 18): Code.exprToDoc has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (11 pts), match/switch 4 (7 pts) (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":"core/src/main/scala/dev/bosatsu/codegen/python/Code.scala"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1dbcae0d466a754c8ed98a97490a3f7b6a49b4974b3ce54fe8c00ea6e1922ad"}},{"ruleId":"D2","level":"warning","message":{"text":"VendoredDeps.ensureArchive (cognitive 18): VendoredDeps.ensureArchive has cognitive complexity 18 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 2 (5 pts), match/switch 2 (3 pts) (nesting depth added 10). 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":"core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala"},"region":{"startLine":528}}}],"partialFingerprints":{"codehealthFindingId/v1":"920891a6f815c971d468be18ef29801310135be93f091f6a1f8d6c0218505f9b"}},{"ruleId":"D2","level":"warning","message":{"text":"CheckBenchmarkMain.parseArgs (cognitive 17): CheckBenchmarkMain.parseArgs has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 9 (17 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":"cli/src/main/scala/dev/bosatsu/CheckBenchmarkMain.scala"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fb7d9ead869759191352cb294346d82ba54b94c89cab5dbda3b59a37c0d8eb4"}},{"ruleId":"D2","level":"warning","message":{"text":"Nat.\u002B (cognitive 17): Nat.\u002B has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), match/switch 3 (5 pts) (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Nat.scala"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e1213c7deaa71c637c7fc0cff98001743abb5d401659522805b1c4e7d19e5fd"}},{"ruleId":"D2","level":"warning","message":{"text":"Pattern.compactStrParts (cognitive 17): Pattern.compactStrParts has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 5 (13 pts), if/else 4 (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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e7960aa554db89d1753742b5400915e80f04fe8b2f6b28bae8b1f97640fa53b"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.runtimeRead (cognitive 17): PredefImpl.runtimeRead has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 1, 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":1587}}}],"partialFingerprints":{"codehealthFindingId/v1":"9549709695029d9b4286bb915917017fda5adf2abad22efe92618eb74179a3d7"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.core_write_bytes_to_handle (cognitive 17): PredefImpl.core_write_bytes_to_handle has cognitive complexity 17 (threshold 15). Drivers by points: error handling 2 (6 pts), if/else 2 (6 pts), match/switch 3 (5 pts) (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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":2266}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dafbfe7a693d34d372fff8740981d4c82dd899b362ca9705eff299636ada373"}},{"ruleId":"D2","level":"warning","message":{"text":"PredefImpl.prog_core_sleep (cognitive 17): PredefImpl.prog_core_sleep has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (7 pts), error handling 2 (6 pts), loops 2 (3 pts), 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3727}}}],"partialFingerprints":{"codehealthFindingId/v1":"e84e37b8c56c9949d99ae891ac082b5fb1ca6eee8ea81fd0f3771eecd8178ca2"}},{"ruleId":"D2","level":"warning","message":{"text":"ProtoConverter.definedTypeToProto (cognitive 17): ProtoConverter.definedTypeToProto has cognitive complexity 17 (threshold 15). Drivers by points: loops 4 (10 pts), match/switch 2 (7 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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":1488}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b7d981243c89cd752393c3bb2adfc64ae9288a255f912f4b2fe24924a3619fb"}},{"ruleId":"D2","level":"warning","message":{"text":"Expr.absorbMultConst (cognitive 17): Expr.absorbMultConst has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8, loops 2 (7 pts), match/switch 1 (2 pts) (nesting depth added 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":517}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3cc41806d194517151a116dd843399e36266cd13af0cd8c23189fdce4e43a3c"}},{"ruleId":"D2","level":"warning","message":{"text":"GroupSum.apply (cognitive 17): GroupSum.apply has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 4 (13 pts), if/else 3 (4 pts) (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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1851}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a5b777dfe04cbebd75535ed0c0644088813e328a30c71d0f92e8d2347d51b52"}},{"ruleId":"D2","level":"warning","message":{"text":"TypeValidator.canWidenInScopeAndSolve (cognitive 17): TypeValidator.canWidenInScopeAndSolve has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 3 (12 pts), if/else 4 (5 pts) (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":"core/src/main/scala/dev/bosatsu/TypeValidator.scala"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"43659d127a412bc0cdde48a8f666cb7f112be97d3fe20e83bad612cd0e8979c2"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.prove (cognitive 17): Impl.prove has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 3 (12 pts), if/else 4 (5 pts) (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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":2284}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae06ecc517730b876e60eacf52edfcdc656456fb4988dc6523fe96a9efc307b2"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.classifyIntArg (cognitive 17): Impl.classifyIntArg has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 4 (11 pts), if/else 3 (6 pts) (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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":2814}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d3587c3319c07402023de60f7c1e8236c1959150bd37ba66341331b48285545"}},{"ruleId":"D2","level":"warning","message":{"text":"Idents.unBase62 (cognitive 17): Idents.unBase62 has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (16 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":"core/src/main/scala/dev/bosatsu/codegen/Idents.scala"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"f69f290e1fc30375bd3320e2d74516f8a5943a75a96e87412e710815dd35bba3"}},{"ruleId":"D2","level":"warning","message":{"text":"StrPart.compact (cognitive 17): StrPart.compact has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 5 (13 pts), if/else 4 (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":"core/src/main/scala/dev/bosatsu/pattern/StrPart.scala"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"994fb9be50cf59c331c15d54d83cbd448dfcc1806e49df4d74606e991671a8f0"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.subsCheckFn (cognitive 17): Impl.subsCheckFn has cognitive complexity 17 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 4 (7 pts) (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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":898}}}],"partialFingerprints":{"codehealthFindingId/v1":"21fc82a593e216e369aeb6c6fd56b5a6dc7ad6a4da4ccbea46f9f8a9103f4cfa"}},{"ruleId":"D2","level":"warning","message":{"text":"NameCheck.collectMissingNames (cognitive 17): NameCheck.collectMissingNames has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (11 pts), match/switch 2 (5 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":"core/src/main/scala/dev/bosatsu/rankn/NameCheck.scala"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d723003023d63554d0d94e1f094d224268045b493d9c01dc55d4a5b3126fee0"}},{"ruleId":"D2","level":"warning","message":{"text":"Matchless.applyArgs (cognitive 16): Matchless.applyArgs has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (11 pts), if/else 4 (5 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1323}}}],"partialFingerprints":{"codehealthFindingId/v1":"0184b28f4b48e7896a201f008f91fc661a4629043051d10d0dd65617a55b1742"}},{"ruleId":"D2","level":"warning","message":{"text":"State.remove (cognitive 16): State.remove has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (13 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":"core/src/main/scala/dev/bosatsu/MemoryMain.scala"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b623e86bf551ff50904fb4fbca3255b940d3aed175c9edb32daefa5fcef80a"}},{"ruleId":"D2","level":"warning","message":{"text":"ParserHints.assignmentInConditionRule (cognitive 16): ParserHints.assignmentInConditionRule has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 4, 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":"core/src/main/scala/dev/bosatsu/ParserHints.scala"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"60877d55fd5c3acad7b12bff366b27715ef25da25c6fdbff71c34bf320f6c49d"}},{"ruleId":"D2","level":"warning","message":{"text":"ParserHints.nearestUnclosedDefLineBefore (cognitive 16): ParserHints.nearestUnclosedDefLineBefore has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), match/switch 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":"core/src/main/scala/dev/bosatsu/ParserHints.scala"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"574683d3c0e47ac2dea637cbe97d54a034404d768a9259516963a443399a7fe5"}},{"ruleId":"D2","level":"warning","message":{"text":"RingOpt.norm (cognitive 16): RingOpt.norm has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (10 pts), match/switch 3 (5 pts), boolean chains 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":2279}}}],"partialFingerprints":{"codehealthFindingId/v1":"88171b38b0a4e8f75f7b4172ab91881dff8f1d6f8ad7409ffbbd606f88981f77"}},{"ruleId":"D2","level":"warning","message":{"text":"Stack.toValue (cognitive 16): Stack.toValue has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 7 (15 pts), if/else 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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1483}}}],"partialFingerprints":{"codehealthFindingId/v1":"f25ac3771e09b77599b0967267bc3d39de06b40989a859e465b518ee19fd01ca"}},{"ruleId":"D2","level":"warning","message":{"text":"SourceConverter.defaultHelpersForTypeDefinition (cognitive 16): SourceConverter.defaultHelpersForTypeDefinition has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 4 (9 pts), if/else 3 (7 pts) (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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2474}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0bde96c759ae2b44cd47281db1c0092600a48793875cadf827a9b9db3b3d2d1"}},{"ruleId":"D2","level":"warning","message":{"text":"Env.innerFn (cognitive 16): Env.innerFn has cognitive complexity 16 (threshold 15). Drivers by points: loops 4 (14 pts), if/else 2 (nesting depth added 10). 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":721}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea62442f6424c14be8c1286a5ef0839caf7c894502ca7e17cc641a98b3c8c63f"}},{"ruleId":"D2","level":"warning","message":{"text":"Op.toDoc (cognitive 16): Op.toDoc has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), match/switch 3 (6 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":"core/src/main/scala/dev/bosatsu/codegen/python/Code.scala"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"0156f22e83bb64558546fa47d61fc82c86015ec5402d34e4d3efcfc2bf153bac"}},{"ruleId":"D2","level":"warning","message":{"text":"LibConfig.validatePreviousHist (cognitive 16): LibConfig.validatePreviousHist has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), 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":"core/src/main/scala/dev/bosatsu/library/LibConfig.scala"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"d455498cd60d6dff89d3af74cbe9bc9d07fb2df2fa80e9b29c4357031398397b"}},{"ruleId":"D2","level":"warning","message":{"text":"Impl.checkApplyDom (cognitive 16): Impl.checkApplyDom has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), match/switch 3 (7 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1925}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a9b3b6ef5576fc39bbe312f6d5ac6c43202befdf0e3ebf57b94631a3666545e"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeImport (cognitive 16): ShowEdn.decodeImport has cognitive complexity 16 (threshold 15). Drivers by points: loops 4 (14 pts), if/else 1, match/switch 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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1217}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4c49e2c1ffbbd2c126f869baeba4b124f5e91ee6605f750bca2053006609922"}},{"ruleId":"D2","level":"warning","message":{"text":"ShowEdn.decodeExport (cognitive 16): ShowEdn.decodeExport has cognitive complexity 16 (threshold 15). Drivers by points: loops 3 (9 pts), match/switch 2 (5 pts), if/else 2 (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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1263}}}],"partialFingerprints":{"codehealthFindingId/v1":"efb78ab7e00815d2e892484ba58614181c5a07f4338bd73d065a15620e2dd448"}},{"ruleId":"D2","level":"warning","message":{"text":"CheckCommand.compile (cognitive 16): CheckCommand.compile has cognitive complexity 16 (threshold 15). Drivers by points: loops 5 (15 pts), match/switch 1 (nesting depth added 10). 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":"core/src/main/scala/dev/bosatsu/tool_command/CheckCommand.scala"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cd877df08f3956b0caa3fa7330a4249b6070e1495dc2a06ea04aae0c011240e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Matchless.fromLet: MethodTooLong \u2014 fromLet runs 2929 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2829 over it, 29.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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":5368}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f963570a5772ec94d87bdb7c6b6e3ea6dd10946765108ca59dcca3534a541ab"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Matchless.fromLet: MethodTooLong \u2014 fromLet runs 2913 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2813 over it, 29.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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":5387}}}],"partialFingerprints":{"codehealthFindingId/v1":"85fd7172e552d890958f47db70a2c39589ca84c7a65e5e88d7ce761f006d503a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Matchless.fromLetRaw: MethodTooLong \u2014 fromLetRaw runs 2902 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2802 over it, 29.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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":5400}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecf645db3a3d134ea5a478be103ffbe1b9118227f0e77b87a3a22d86e2c77f48"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/Matchless.scala: FileTooLong \u2014 7261 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 6761 over it, 14.52\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e264d22124e63e61e178ee4681018e05ec39e5d8278ae47f3aa14c83fefe85ee"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PredefImpl: TooManyMethods \u2014 306 methods. The bar is 30 methods; this is 276 over it, 10.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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":688}}}],"partialFingerprints":{"codehealthFindingId/v1":"02db50d1c0d75d9cfe02be9f541a53f83508d9b60f55229b6e9311124e9f24f3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/Predef.scala: FileTooLong \u2014 3698 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 3198 over it, 7.40\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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"174c483f546c1d33b85a34c9db5b7db68688370e9a2e208eeaf7c19495523d50"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/TypedExpr.scala: FileTooLong \u2014 3295 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2795 over it, 6.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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"efa0d7302c70d1a359409714d20b57d24d30d0f6df958ee671a8cb73f181bff5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/TypedExprRecursionCheck.scala: FileTooLong \u2014 3177 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2677 over it, 6.35\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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e74a0060151d0d2250f0f514fa261a3fa2ca759cb842ba6c7ba104fa2de342dd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/TypedExprNormalization.scala: FileTooLong \u2014 2845 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2345 over it, 5.69\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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"18bb24b0d20c192ecef092876d5f8a9fdf0fe328ae9a3c4283bc4756e94c0c7a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/SourceConverter.scala: FileTooLong \u2014 2528 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2028 over it, 5.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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83bd2ed26642d8051d07c95f297a965aaca970d5aec5fa1b6dfbcd93eb98528"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: rankn/Infer.scala: FileTooLong \u2014 2518 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2018 over it, 5.04\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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9569cca6dd4c0492b13d6afea004a494b628d39cf4591b0620bf06d9a33f29c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: library/Command.scala: FileTooLong \u2014 2510 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 2010 over it, 5.02\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4633284177618f89a4783d7defd0a35c2d43a2047625a0119c6543e835eb9af"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Impl: TooManyMethods \u2014 145 methods. The bar is 30 methods; this is 115 over it, 4.83\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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"13109b5602ca6852075721b889c3d140ddb62befcf16b2c660a60da26ad45402"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/PackageError.scala: FileTooLong \u2014 1896 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1396 over it, 3.79\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":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b09b09cbafd1dc3df0fc0c007548e7578edc53f987035abd414e57f05b4d0d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/ProtoConverter.scala: FileTooLong \u2014 1885 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1385 over it, 3.77\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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94fc0882832367e22082902f540dbe971279670090d8854f0b5e017bbed0fcde"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ShowEdn: TooManyMethods \u2014 113 methods. The bar is 30 methods; this is 83 over it, 3.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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bc77439a5d868c8446dece1a8b73796ac8ff77a53919d247c24f654961d82b2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tool/ShowEdn.scala: FileTooLong \u2014 1838 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1338 over it, 3.68\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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a95e5036e917b1ef85632b9dafb185e946a130f12391454deb2e5b671cabc59f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PredefIoCorePlatform: TooManyMethods \u2014 107 methods. The bar is 30 methods; this is 77 over it, 3.57\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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e03d9f3c5c51f81f25381980af91dd38979cbf9ae478d609042e0d106fba06"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/RingOpt.scala: FileTooLong \u2014 1594 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1094 over it, 3.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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"290fdc39c63114d262591fc6f0136269434d0c60ee6f38004f1e56a14a5518bb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ValueToJson.toValue: MethodTooLong \u2014 toValue runs 317 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 217 over it, 3.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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":695}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb3e5ef0f46915e380e08bedd41e75eda3c4d5f8eb9659a2080a965419f15e76"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SeqPattern.seqPatternSetOps: MethodTooLong \u2014 seqPatternSetOps runs 305 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"core/src/main/scala/dev/bosatsu/pattern/SeqPattern.scala"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b2a5ff0ab7e08053c4560849f34f9f02a7eea98bb71f5b6379dbbc27ef086a5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: rankn/Type.scala: FileTooLong \u2014 1461 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 961 over it, 2.92\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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6ce71f4fb6d82466997d1c3398338dd5c0367e90a3b6c77d17acb02f9708ec"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ProtoToBosatsu: TooManyMethods \u2014 87 methods. The bar is 30 methods; this is 57 over it, 2.90\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":"core/src/main/scala/dev/bosatsu/protobuf/ProtoToBosatsu.scala"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aad2d987ea872b5b45fa5e7aaa00cc3fe758a15d918606485c7c0a797708e6b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ValueToJson.toJson: MethodTooLong \u2014 toJson runs 289 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 189 over it, 2.89\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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f113448a732b28efaba410346e25a9ba6dd22659f1e3a1024ef2485ac92a626"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/Declaration.scala: FileTooLong \u2014 1407 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 907 over it, 2.81\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":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b153664ce99e90cbf7d03691533e6db757c5e1f3cdd3df94d75f7d798a04ed3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: protobuf/ProtoToBosatsu.scala: FileTooLong \u2014 1330 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 830 over it, 2.66\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":"core/src/main/scala/dev/bosatsu/protobuf/ProtoToBosatsu.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2076503ec7ee26f611b1886c69d3d90c58ba56a269c899b6898b71403b936256"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/PredefIoCorePlatform.scala: FileTooLong \u2014 1323 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 823 over it, 2.65\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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"856469aa53e70307e1b8b793da7778215ccb64a4581b1ab419bcd781c301f75e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ProtoConverter: TooManyMethods \u2014 79 methods. The bar is 30 methods; this is 49 over it, 2.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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"85172a9ce4f4cbb1b3e30762cfe10cf539eb69e8089691fe6e18d933ac12adf6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Impl: 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1a21ff9c56b7988b6090ada5967c0289d7852285dcb15f8c9fa4be780adba05"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: MatchlessGlobalInlining.rewriteExpr: MethodTooLong \u2014 rewriteExpr runs 238 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 138 over it, 2.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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"6037e68d78ee2da2d73d1bb652b34bffb1cde1855dbe98a315e4e39e5decebff"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/TypeValidator.scala: FileTooLong \u2014 1172 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 672 over it, 2.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":"core/src/main/scala/dev/bosatsu/TypeValidator.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"61bcaa2148d0f41e271f512ed10a6572784eae105622f3f518df18f1711b38b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/Pattern.scala: FileTooLong \u2014 1140 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 640 over it, 2.28\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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d622ed9cec70bd76578a48f8063225dd721ceb90c71426ee7c1ef325ac8574f6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ValueToDoc.toDoc: MethodTooLong \u2014 toDoc runs 206 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 106 over it, 2.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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f63ad9e9724836f67d6792e279248c76f45d731ad6ea38fd4d946bc6f641623"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Type: TooManyMethods \u2014 59 methods. The bar is 30 methods; this is 29 over it, 1.97\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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ffffd2762fd66bbb2f9f03c6e77d6b1ea1c24e363709888f7d3ddc68d4e7e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/Package.scala: FileTooLong \u2014 915 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 415 over it, 1.83\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":"core/src/main/scala/dev/bosatsu/Package.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1134ff890e156fc133db0014d4767f0a2eba70251e67d08ec039060c82fc8389"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/TotalityCheck.scala: FileTooLong \u2014 902 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 402 over it, 1.80\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":"core/src/main/scala/dev/bosatsu/TotalityCheck.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d02172b3cf07b4eac7487cb454495d7e563c52ed7ea9cbabd86d60ebc1ddbe"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: library/LibConfig.scala: FileTooLong \u2014 902 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 402 over it, 1.80\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":"core/src/main/scala/dev/bosatsu/library/LibConfig.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c132ea144163202bb4f4dae085ca0efa68e04fcb6841bbcb956a4315bfd519"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ProtoConverter.buildExprs: MethodTooLong \u2014 buildExprs runs 179 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 79 over it, 1.79\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":"core/src/main/scala/dev/bosatsu/ProtoConverter.scala"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"31d82b56b00e4c2c382448341cdab71c171267f635576b00e3072dd9f63c48a6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/PackageMap.scala: FileTooLong \u2014 884 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 384 over it, 1.77\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":"core/src/main/scala/dev/bosatsu/PackageMap.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a21d52decfa373f959d654a69516c00c3e2e5284933dca72f7de49ea65a9de2a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TypedExpr.zonkMeta: MethodTooLong \u2014 zonkMeta 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2629}}}],"partialFingerprints":{"codehealthFindingId/v1":"feddeb603c04bf4e2505f6da20c3bc1df95050c46d230dda85d31d2bb0e0ceca"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/ValueToJson.scala: FileTooLong \u2014 860 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 360 over it, 1.72\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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f20816a37c160bad6eb7f37aee36842caa5b1b40555649230c4bf4510fe580c9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TypedExpr.quantify: MethodTooLong \u2014 quantify runs 172 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2640}}}],"partialFingerprints":{"codehealthFindingId/v1":"95bef6e7d6cf82d786cfa7874156828ab1b9faf9fa69901394671744d496fe52"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/KindFormula.scala: FileTooLong \u2014 825 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: KindFormula (29-1119). The bar is 500 significant lines; this is 325 over it, 1.65\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":"core/src/main/scala/dev/bosatsu/KindFormula.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02fa768aa222d028b89c22020a4ac9703cb76169e038059d82b10af53f11356a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/TypedExprLoopRecurLowering.scala: FileTooLong \u2014 787 significant lines (blank, comment-only and punctuation-only lines excluded). 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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8038ba9152622e71d564b1bc703f3a62982aa63d9d8166d1d4c73f9c82b8287"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tool/CompilerApi.scala: FileTooLong \u2014 783 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 283 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":"core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2287ed304d11afa5a2f469829081b6fdf2cad0f711e6c5dd4ac8ba68051d9c84"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/MatchlessGlobalInlining.scala: FileTooLong \u2014 768 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 268 over it, 1.54\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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6170b3f6cf3bd22b13324d7614c4782ba5f80d5e2271461c0dde13037615e562"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Matchless: TooManyMethods \u2014 46 methods. The bar is 30 methods; this is 16 over it, 1.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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"3abb45ad8a3b56671cd4fb6b150baa3cbd6b6f4da64444e2a94a2256ecc9cf04"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/Expr.scala: FileTooLong \u2014 762 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 262 over it, 1.52\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":"core/src/main/scala/dev/bosatsu/Expr.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa64232d72521c44823031560658d0349b963a495a0c026638a11fdc3cd9db35"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: tool/MarkdownDoc.scala: FileTooLong \u2014 754 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 254 over it, 1.51\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":"core/src/main/scala/dev/bosatsu/tool/MarkdownDoc.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cbcc5dd751b0d6d2f44cbcadf890025de19b67378a50c8c3ae26a18224cbc3d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TypedExpr: TooManyMethods \u2014 45 methods. The bar is 30 methods; this is 15 over it, 1.50\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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"e48216513b4958e17bfd7dd9c50d6566fcbfb9664531a50873305d3b4ebb22de"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: cruntime/VendoredDeps.scala: FileTooLong \u2014 748 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 248 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":"core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8599c388797ea885cc0a4ae4e1467a57c8504642ca92f5903b93c6a711d2b3a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MarkdownDoc: TooManyMethods \u2014 44 methods. The bar is 30 methods; this is 14 over it, 1.47\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":"core/src/main/scala/dev/bosatsu/tool/MarkdownDoc.scala"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"468dd13d45d8d47bac54f5413ee6c99c53521dcee5fefb46c6ecb6f10de7e7c5"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: InvariantTypedExpr.traverseType: MethodTooLong \u2014 traverseType runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2309}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f86d7560f309e7aaae348f715ffbe29ef8d083931262236bcd026a30f215c49"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: IOPlatformIO: TooManyMethods \u2014 40 methods. The bar is 30 methods; this is 10 over it, 1.33\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":"cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a6c038cf481aa7c73ee220dc7f1e6675e38cf13e7e64d3434277c428f8776a4"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Fs2PlatformIO: TooManyMethods \u2014 40 methods. The bar is 30 methods; this is 10 over it, 1.33\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":"cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f482e8e0f7d09355034a68594138a7a528b20e138b9cafc0bd9d61849f50dd"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VendoredDeps: TooManyMethods \u2014 40 methods. The bar is 30 methods; this is 10 over it, 1.33\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":"core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"96027b9e5c0755b776c159ccd93caf2ad01513d20badb9be2a8b829d53fd1703"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SourceConverter: TooManyMethods \u2014 37 methods. The bar is 30 methods; this is 7 over it, 1.23\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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"dca2e981a7025f3adfbb83d1c1df5b98ee5f8653a93a96f21927825681012033"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TypedExpr.substituteAll: MethodTooLong \u2014 substituteAll runs 123 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3543}}}],"partialFingerprints":{"codehealthFindingId/v1":"605a8239cc2943fc6da4527e3dcf0c392fecf2b591fe58a64ed09007bb90e6b8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/Json.scala: FileTooLong \u2014 612 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 112 over it, 1.22\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":"core/src/main/scala/dev/bosatsu/Json.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"065941f958036efcfbf916fda5651617e3fbfb35c7663bc1cb831bf864b45577"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PackageMap: 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":"core/src/main/scala/dev/bosatsu/PackageMap.scala"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"9703ad2b137d9c791145e942b44a880cc55c60e4072fbed8538d1abc714731a5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ParserHints: 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":"core/src/main/scala/dev/bosatsu/ParserHints.scala"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"264c057e735afc8296b1ee3c3528867b0306109eda0dde55a45a751811960f94"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: bosatsu/Shape.scala: FileTooLong \u2014 559 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: Shape (19-726). The bar is 500 significant lines; this is 59 over it, 1.12\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":"core/src/main/scala/dev/bosatsu/Shape.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63a062fa9be20d3bc882d516ef957a7651f1983af285a119e792612828ee7b46"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: InvariantTypedExpr.traverseUp: MethodTooLong \u2014 traverseUp runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2491}}}],"partialFingerprints":{"codehealthFindingId/v1":"c919a482be96a2e23cfa6f1f8616a734f7ac78347558c5083a575c7f9562e17a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: library/ApiDiff.scala: FileTooLong \u2014 549 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 49 over it, 1.10\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":"core/src/main/scala/dev/bosatsu/library/ApiDiff.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94936719485036de22ab7bff3941b78026c4f70162bc6005c8d79d5989e81b4a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: InvariantTypedExpr.foreach: MethodTooLong \u2014 foreach runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2006}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eebf19ef0fd32e96e3e3872b04c7e76bf174a1ba1247b4c6945bb49d6c85a47"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TypedExprNormalization: TooManyMethods \u2014 32 methods. The bar is 30 methods; 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d8e8c2f3e3b729ab893d34d2af597c42d64c9b08d84e85c44eb704f9eb17ec"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: InvariantTypedExpr.foreachTraversedType: MethodTooLong \u2014 foreachTraversedType runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2011}}}],"partialFingerprints":{"codehealthFindingId/v1":"18b2698c224d4a126e766d66baa1e29c78d8a0e38235e663c7e3f3c0d5657c73"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: StringMatcher: 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4111}}}],"partialFingerprints":{"codehealthFindingId/v1":"008e51eb038dd2888a8c5b752177c69c1200d049e916f364f473021b5a9dada8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: protobuf/CodeGenerator.scala: FileTooLong \u2014 516 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 16 over it, 1.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":"core/src/main/scala/dev/bosatsu/protobuf/CodeGenerator.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e8e03d6620497de3488c1d34cfa1026cd463236e27e0e65fa2e05e78b9f386"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Solver.unifyShape: MethodTooLong \u2014 unifyShape runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"core/src/main/scala/dev/bosatsu/Shape.scala"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a7d9caec33db5b1bc32d684a72c1e1735ef4978103a1693c1ec9ace0266913"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (61 shared lines): cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala:289-386 | cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:273-365 \u2014 These two members are variants of one another: 61 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":"cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"10724b990ab93dc9105a2fc1fc935eb7f6ca5b749d28fe7bc98b2d29f7070ee4"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (46 shared lines): core/src/main/scala/dev/bosatsu/Matchless.scala:683-753 | core/src/main/scala/dev/bosatsu/Matchless.scala:755-817 \u2014 These two members are variants of one another: 46 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":683}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e8435c6fe8cf2ce8600449eca8f4a456d230acd19cf11b9240cb471cfdc53ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (45 shared lines): core/src/main/scala/dev/bosatsu/Matchless.scala:415-491 | core/src/main/scala/dev/bosatsu/Matchless.scala:493-568 \u2014 These two members are variants of one another: 45 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":415}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9d8307052b3064aba8f9f97bf77d507bf614d0cfe2dc0e821485a3f1f707ffd"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (34 shared lines): core/src/main/scala/dev/bosatsu/TypedExpr.scala:792-852 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:943-995 \u2014 These two members are variants of one another: 34 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":792}}}],"partialFingerprints":{"codehealthFindingId/v1":"10a291479fcf78718f485a9242590cf3bf8e6051ae2767da77c3b259a238d5ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (20 corresponding lines): core/src/main/scala/dev/bosatsu/cruntime/Command.scala:13-334 | core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala:885-910 \u2014 These two members are one piece of code written twice and then edited apart: 20 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/cruntime/Command.scala"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"faa8758c347e3114f0393cbabe5f40e3c37532ad54586c55a55137efd50cdc45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (51 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:4573-4623 | core/src/main/scala/dev/bosatsu/Matchless.scala:4791-4841 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:4573\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4573}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a467c7a5c603a78e77234151111a8978bfaf5b136f4e20ed0821298e5b36b57"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:694-735 | core/src/main/scala/dev/bosatsu/Predef.scala:2398-2439 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:694\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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":694}}}],"partialFingerprints":{"codehealthFindingId/v1":"7373d7ebcb04f202ed0391c6bd8b00aa89c4424d989ded7fa98c015f24019978"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:1925-1961 | core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala:204-240 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/library/Command.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 108 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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":1925}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3259cc37e2f8a345bde75e5eab9ed28f7e4382b17ffeef875dc64cf51501176"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34\u201335 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:314-347 | core/src/main/scala/dev/bosatsu/Matchless.scala:379-413 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:314\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"3795374b2339dfabc26eee6b34eed15a4c6cdffc52754fc05ade0b1b805d5f45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:898-929 | core/src/main/scala/dev/bosatsu/Matchless.scala:1557-1588 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:898\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":898}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2e64c92203e930af32d8abfcbf0a259eedefe477e92128a7a6f2fe3aa0fa542"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:1839-1870 | core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala:114-145 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/library/Command.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 108 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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:1839\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":1839}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3c53613f754c140959f06d1bea153d87aa53a1c1e68be2def9df04f312a6ac3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): core/src/main/scala/dev/bosatsu/PackageError.scala:60-89 | core/src/main/scala/dev/bosatsu/rankn/Type.scala:877-906 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/PackageError.scala:60\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":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1ae8c0e93e3fd2a255bf093ea82a164d4d1f2e9aec5a11d241bd4bc821f505a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29\u201330 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:1892-1921 | core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala:166-194 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/library/Command.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 108 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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:1892\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":1892}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7544d24e9f4963508433cd5a471cce66ed36204f3c748be64f272f55589244a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1251-1277 | core/src/main/scala/dev/bosatsu/Matchless.scala:8842-8868 \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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1251}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fbb058e0b34031961296dc8a1eb235ecfe284d7628032514a0740af01c72678"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:416-441 | core/src/main/scala/dev/bosatsu/Matchless.scala:494-519 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:416\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"761c8129a631cb8aad895aa5206a0847c862dd7906ade18385240094c170aef2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:4534-4559 | core/src/main/scala/dev/bosatsu/Matchless.scala:4752-4777 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:4534\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4534}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d62b2e9554bc19403c496217fcfa9fa576d37d3479739095ed97a4e8a93a79b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1855-1879 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:2341-2365 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1855\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1855}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52d1d269ffd71b0740ed92ad02228291659305d513b992b91c005036c7260cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:872-895 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:905-928 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExpr.scala:872\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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":872}}}],"partialFingerprints":{"codehealthFindingId/v1":"1815ee8f841acfa2baf131e416c5603975fdb5247bac1ccdc86ba22c836f2d41"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201324 lines \u00D7 2): core/src/main/scala/dev/bosatsu/ValueToJson.scala:535-558 | core/src/main/scala/dev/bosatsu/ValueToJson.scala:973-994 \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 \u0060core/src/main/scala/dev/bosatsu/ValueToJson.scala:535\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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"4766a3d76440b993c0f2d76508b01e3261a9e4271eb5779f410ea9089526fc52"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala:334-356 | cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:312-334 \u2014 before extracting anything, compare \u0060cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala\u0060 and \u0060cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 75 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 \u0060cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala:334\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":"cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"d72a22e0627a9240cc5cd02cd95458e1d04f4a92b97e8cc69cf141fdbc55cd40"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala:364-386 | cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:343-365 \u2014 before extracting anything, compare \u0060cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala\u0060 and \u0060cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 75 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 \u0060cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala:364\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":"cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"f98ccfa6661c0d2605aaf8185aff7253806a793d2aaeccc23777232d8ecbc64a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala:437-458 | core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala:486-507 \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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa68ea82e80e7736c5d69862c3793bda7a3239ee0e8386f16346336950e02fa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:292-312 | core/src/main/scala/dev/bosatsu/Matchless.scala:358-378 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:292\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 before the matched lines, \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:356\u0060 calls \u0060WhileExpr\u0060, \u0060loopBool\u0060, \u0060loopExpr\u0060 and \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:291\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cf85e394dd83c501a476bdc725ff6edc18a2f294a230361f9f57ee45387269a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:712-732 | core/src/main/scala/dev/bosatsu/Matchless.scala:780-800 \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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":712}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f35938d3586acb5ee24268c91348dab96b83d3ec6fb5f7dbbf4a90718ac5e3a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201321 lines \u00D7 2): core/src/main/scala/dev/bosatsu/cruntime/Command.scala:164-184 | core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala:888-907 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/cruntime/Command.scala: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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/cruntime/Command.scala"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8d0710b207941e8c06d53dc74ac7f51c8659c8d641c90887bc95b94901dca47"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:4649-4668 | core/src/main/scala/dev/bosatsu/Matchless.scala:4868-4887 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:4649\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4649}}}],"partialFingerprints":{"codehealthFindingId/v1":"52342d7e82848ca3516b674d1595b3d1cdeb0fca93298ec236e2948808488858"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Evaluation.scala:134-152 | core/src/main/scala/dev/bosatsu/library/LibraryEvaluation.scala:279-297 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/Evaluation.scala:134\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":"core/src/main/scala/dev/bosatsu/Evaluation.scala"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"cca7f2b6f592ffb2f2c54a369bccd1f013b2d081fb4087fd5ad0b3323bace592"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201319 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1881-1892 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:2367-2385 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1881\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1881}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e92dfd960a86611ecf34b27db0fc37054f41341dd4e92b7d4c1090de62e46d1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:4492-4510 | core/src/main/scala/dev/bosatsu/Matchless.scala:4714-4732 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:4492\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4492}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3d5d9e0d996dadc8dbf06e1014e5143978c86efc8e017c26e0c1e094694d67c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:6684-6701 | core/src/main/scala/dev/bosatsu/Matchless.scala:6731-6749 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:6684\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":6684}}}],"partialFingerprints":{"codehealthFindingId/v1":"310e30e7c2bdc412f48e3a6808fca89ee2937bd556c8852352c97a59cefcd145"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): core/src/main/scala/dev/bosatsu/SourceConverter.scala:2019-2037 | core/src/main/scala/dev/bosatsu/SourceConverter.scala:2062-2079 \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 \u0060core/src/main/scala/dev/bosatsu/SourceConverter.scala:2019\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 first that the copies are not typed on the same thing: the declarations holding them bind \u0060paramLen\u0060 to \u0060params) =\u003E val argLen = args.size val paramLen = params.size if (argLen ==\u0060 in one and \u0060params) =\u003E val argLen = args.size val paramLen = params.size if (argLen \u003C=\u0060 in another, and the duplicated lines use it. The extracted unit therefore needs a parameter type that fits BOTH \u2014 their common supertype where they have one, or a new abstraction over them where they do not \u2014 and settling that is the step that comes BEFORE the extraction above. Where the two types are deliberately unrelated, the duplication is the price of that separation and the honest resolution is to record the decision rather than to extract."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2019}}}],"partialFingerprints":{"codehealthFindingId/v1":"78aa9d8b1c80be7dcb2c6674291ae8df31f24ab3b62871c67ed11dc1a42469ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:793-811 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:944-961 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExpr.scala:793\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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"624aad56a7025b1a9c8fe1bba762ba9fca572da9a437f91961b4a477ffd30fe1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1055-1073 | core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1123-1141 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1055\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":1055}}}],"partialFingerprints":{"codehealthFindingId/v1":"2002cf0121159f9f14457b61701e3c958e5e58bc103ce9dd1fb655a1e18b855d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala:436-454 | core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala:456-474 \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":"core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"c242f64a5f21eec0105f6f5eb60470c8ed66cc3aac133c494edc7024d59e18af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Predef.scala:3083-3100 | core/src/main/scala/dev/bosatsu/Predef.scala:3103-3120 \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 \u0060core/src/main/scala/dev/bosatsu/Predef.scala:3083\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3083}}}],"partialFingerprints":{"codehealthFindingId/v1":"27a04a5014a8e328e38b34d45dd6c0941192a78216992278ac2fca1b43e95824"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:2213-2230 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:2260-2277 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:2213\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2213}}}],"partialFingerprints":{"codehealthFindingId/v1":"17e9b7b450294be684a66ef9bc1e84151b43aa953dca89227b0fbe9caa2b797f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala:277-294 | core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala:349-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 \u0060core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala:277\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cec095d0db4cd723cd3e78a60d1d367a628213b9df3f00ff177154bb23d07c6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:2273-2290 | core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala:112-129 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/library/Command.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 59 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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":2273}}}],"partialFingerprints":{"codehealthFindingId/v1":"07781b8b4005d57adda31549983208b30f2b397482e4d21cb2271861bf2b237b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201317 lines \u00D7 3): core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1643-1659 | core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1750-1761 | core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1893-1904 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1643\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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":1643}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bd27f508cd42bc6bf6a4f8d261bd4846a2cf64c7182ad7e7474085c43d25907"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 3): core/src/main/scala/dev/bosatsu/library/Command.scala:2364-2380 | core/src/main/scala/dev/bosatsu/library/Command.scala:2405-2421 | core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala:158-174 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/library/Command.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 59 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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:2364\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":2364}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ecceb0d23aa67f1d6cae90300041e18f8e2c51d5a6a9dbb68742901b93631f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1280-1296 | core/src/main/scala/dev/bosatsu/Matchless.scala:8871-8887 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1280\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1280}}}],"partialFingerprints":{"codehealthFindingId/v1":"16e5e314880156312449f2c62fa849b5417c601695c313e69ff57ba500ca4d84"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Package.scala:672-687 | core/src/main/scala/dev/bosatsu/rankn/NameCheck.scala:195-211 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/Package.scala:672\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/Package.scala"},"region":{"startLine":672}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b64272dd8c88f8ee40ede7108958eb3ce5e4650b3159e95cf93ec039e76c712"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala:1475-1491 | core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala:1520-1536 \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 \u0060core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala:1475\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":1475}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9dcc992901dbab0e7c9ce1747708be72b1809d44e6985f33a94b3df51df4a21"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala:302-317 | cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:283-297 \u2014 before extracting anything, compare \u0060cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala\u0060 and \u0060cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 75 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 \u0060cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:283\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":"cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"966231ba163b14ce78084ba3c5c9b4c500812a628ce13ab5ee436a828d9244f3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:745-759 | core/src/main/scala/dev/bosatsu/Predef.scala:2447-2462 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:745\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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":745}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b5ba32337c8326a7d89d88a3a95d4ec43830db55abd2f408e46fa769dd0c6b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1381-1395 | core/src/main/scala/dev/bosatsu/Matchless.scala:1789-1804 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1381\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1381}}}],"partialFingerprints":{"codehealthFindingId/v1":"6993b53bc4e02cfba1f707a1c9a675a346a9d103510700c469a2f39b0f861f90"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201316 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1401-1416 | core/src/main/scala/dev/bosatsu/Matchless.scala:1810-1822 \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 after the matched lines, \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1822\u0060 calls \u0060App\u0060, \u0060LetMut\u0060, \u0060argMutIds\u0060 and \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1416\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1401}}}],"partialFingerprints":{"codehealthFindingId/v1":"11ea8953f859ba80304dd5ec9dadb6fcfb4cbb842bc0a0e7d3c82881826de9bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3): core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1664-1678 | core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1766-1780 | core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1909-1923 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala:1664\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala"},"region":{"startLine":1664}}}],"partialFingerprints":{"codehealthFindingId/v1":"329164f10663f7f117eabe6f656cef82250e5dab65bf6ff6ec8ce6683f8982b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): core/src/main/scala/dev/bosatsu/ValueToDoc.scala:142-156 | core/src/main/scala/dev/bosatsu/ValueToJson.scala:486-500 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/ValueToJson.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 45 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 \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala:142\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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaeb9c82edd51550cc728d04fd6ba8a8ce5158b999f083ab3f87a0d43a8a906e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:2197-2211 | core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala:285-299 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/library/Command.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 59 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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:2197\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":2197}}}],"partialFingerprints":{"codehealthFindingId/v1":"43195d207b71b97ea85288bbb8f24973cf5eb1526aeee8e37720091856f57789"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:2347-2361 | core/src/main/scala/dev/bosatsu/library/Command.scala:2386-2400 \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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:2347\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:2401\u0060 calls \u0060JArray\u0060 and \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:2362\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":2347}}}],"partialFingerprints":{"codehealthFindingId/v1":"339a329673d7b4912436dcacae8a1431af37a88fa2833d61a85a56286eef6927"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): core/src/main/scala/dev/bosatsu/rankn/Infer.scala:2978-2992 | core/src/main/scala/dev/bosatsu/rankn/Infer.scala:3011-3025 \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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2978}}}],"partialFingerprints":{"codehealthFindingId/v1":"43b26e4b1a9818553bdfdde0e0c77565648f179c65606ec641b75abe47617c10"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): core/src/main/scala/dev/bosatsu/PackageError.scala:804-817 | core/src/main/scala/dev/bosatsu/PackageError.scala:819-832 \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":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"f423ba6d7e6fdb95f6f30a8afc8a9f7da6a625fa39f28e870df5c38b21926b90"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:3487-3500 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:4118-4131 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExpr.scala:3487\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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3487}}}],"partialFingerprints":{"codehealthFindingId/v1":"3404270fe0c4d473944784051a9e3ba3fa1fc66400da225abc3dba10693fb7e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala:145-158 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:1862-1874 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala:145\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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa44fae84cbdf7871e28db3b76f4f5bdda6778a444c1bbaf94e9283f6283a3ed"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala:75-88 | core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala:264-277 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 37 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":"core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b63656e8417a6f71279d26602a5500dcd6c994b33222dd2cba85cebb58c384f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala:365-378 | core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala:381-394 \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 \u0060core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala:365\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"7078d67912b0da463fbd3fa70d0eeb595e565ea7a28b7d0e3299fd59828095b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala:143-155 | cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:90-101 \u2014 before extracting anything, compare \u0060cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala\u0060 and \u0060cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 75 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 \u0060cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala:143\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"d905697e33b9dac086ddab542b395c60ac35b4a83fb83cc908cdcdc031e36952"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:104-116 | cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:135-145 \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 \u0060cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:104\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ab1962cc359b6626733a73de3f334fe553c82f422919ef4e2f1eedee24ba110"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1046-1058 | core/src/main/scala/dev/bosatsu/Matchless.scala:3026-3038 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1046\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, \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1059\u0060 calls \u0060WhileExpr\u0060, \u0060loopBool\u0060, \u0060loopExpr\u0060 and \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:3039\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1046}}}],"partialFingerprints":{"codehealthFindingId/v1":"b000643a4fce70af25fe02629f4e8b4e3fca43ba9683880042ca92d2335006df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:2288-2300 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:2306-2318 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:2288\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2288}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e1ba883a860cd0c283de20df9b0389a37b38b8a2447673525f3b137950e6f49"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:3373-3385 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:3388-3400 \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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":3373}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e2947aaee5b041673d92e000fb2ec861691d3375d880d86a02ad7cccb23c17"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala:110-122 | core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala:299-311 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 37 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 \u0060core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala:110\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"0da5f077b9085bf3765e99278e49af119251c11794680ce42dcb32af0a7c760d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): core/src/main/scala/dev/bosatsu/protobuf/ProtoToBosatsu.scala:818-830 | core/src/main/scala/dev/bosatsu/protobuf/ProtoToBosatsu.scala:891-903 \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":"core/src/main/scala/dev/bosatsu/protobuf/ProtoToBosatsu.scala"},"region":{"startLine":818}}}],"partialFingerprints":{"codehealthFindingId/v1":"19b50b5948795255aace28c459791d382d8a374b4aafdfc985db2e4fbae63676"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala:270-282 | core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala:287-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. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"af882ea2d8063ee3aa8b2b4bbd05695631bb432280ac1d24029cf8f9288de8c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): core/src/main/scala/dev/bosatsu/Matchless.scala:4653-4664 | core/src/main/scala/dev/bosatsu/Matchless.scala:4872-4883 | core/src/main/scala/dev/bosatsu/Matchless.scala:5100-5111 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:4653\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":4653}}}],"partialFingerprints":{"codehealthFindingId/v1":"c91df748151388901a35d96e09251e7047a2de97ecb3bfc725126d5de793130a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:227-237 | core/src/main/scala/dev/bosatsu/Predef.scala:1934-1945 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2cece5d99b390e2871c053dc33d146a879e1e0cfb856ba49286160de4ca7c19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:9145-9156 | core/src/main/scala/dev/bosatsu/Matchless.scala:9198-9209 \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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":9145}}}],"partialFingerprints":{"codehealthFindingId/v1":"23b080376ca9cf390b5ec0bc3e596aa89945e6ac7fbc61ee8d98cd66a1c491e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): core/src/main/scala/dev/bosatsu/MatchlessToValue.scala:375-386 | core/src/main/scala/dev/bosatsu/MatchlessToValue.scala:489-500 \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":"core/src/main/scala/dev/bosatsu/MatchlessToValue.scala"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd16c72b7e4d044c06fe9430724a277e3252d548c759003ee550e8e2c2b3ca03"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:2021-2032 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:2191-2201 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExpr.scala:2021\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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2021}}}],"partialFingerprints":{"codehealthFindingId/v1":"12389fc1ab8198b2ef771808cd8b825aae1e9214d054a4e1dcd887c60927c1a1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): core/src/main/scala/dev/bosatsu/ValueToDoc.scala:161-172 | core/src/main/scala/dev/bosatsu/ValueToJson.scala:531-540 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/ValueToJson.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 45 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 \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala:161\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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"91c8273ac1b7cf6e3afedb2115d68ba94a2503ddf97da18155f021a202dddf63"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 3): core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala:118-127 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:1042-1051 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:1344-1354 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala:118\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c68e2ad12a8f7147cb44909fe58ead6a2b1c4e98e9abdf37ce92512ad532306"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:3573-3583 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:3587-3597 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:3601-3611 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:3573\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":3573}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf66fdd0035621980e0636a2cef2a3b2114a999a2664589310f75589cde38a75"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:312-321 | core/src/main/scala/dev/bosatsu/Predef.scala:2014-2024 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b98a6a7c80827f29f06124f72d3c3d95e161779ab411a6eba66f8f2cf774c59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:465-475 | core/src/main/scala/dev/bosatsu/Matchless.scala:542-552 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:465\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b092d66cc4acd4bb39016dbf31a8ea59a14617f018ba7358e3aff6de1cfd55d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:7546-7556 | core/src/main/scala/dev/bosatsu/Matchless.scala:8912-8922 \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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":7546}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc9d99474c90d2b448f3bde643ac2697135f0284b5983cbb2b7276d9465291aa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/PackageError.scala:1376-1386 | core/src/main/scala/dev/bosatsu/PackageError.scala:1403-1413 \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 \u0060core/src/main/scala/dev/bosatsu/PackageError.scala:1376\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":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":1376}}}],"partialFingerprints":{"codehealthFindingId/v1":"19343f399c55368d493547489533a944bf295261ccebc3561f188b17f747e3e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/RingOpt.scala:623-633 | core/src/main/scala/dev/bosatsu/RingOpt.scala:1380-1390 \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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":623}}}],"partialFingerprints":{"codehealthFindingId/v1":"724c6f3e3b329248b7241fc6477b1a659c24a372f656241a39426f18462eb2bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala:135-145 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:1846-1856 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala:135\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":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cba4d9047fd752071c7eed55bfcfce0aa1595a02ee2fc38c10ba71c54b2935a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:85-95 | core/src/main/scala/dev/bosatsu/library/Command.scala:1302-1312 \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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:85\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb86f549146b160b2f03e585cf75322dfffd2adbcb491e23db7eae810505e6e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/LibConfig.scala:167-177 | core/src/main/scala/dev/bosatsu/library/LibConfig.scala:293-303 \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":"core/src/main/scala/dev/bosatsu/library/LibConfig.scala"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"c55f6bc3bb740a394be3b07e885a501e3363169657289ffc25b61eb7e2fdebfe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1094-1104 | core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1124-1134 \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 \u0060core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1094\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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1094}}}],"partialFingerprints":{"codehealthFindingId/v1":"93c38c1a8b290039e17ffea56966d3dd1ba3fc5afd448dafe2b1981473b6e7b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala:1042-1052 | core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala:1091-1101 \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 \u0060core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala:1042\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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1042}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ef827c3feaea7946712e203875731477525f279b6f0cbad9ad1817259ae4731"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala:1416-1426 | core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala:1661-1671 \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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":1416}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bf751188e6d55514b4e619da5b45a0e83508de7b41f4cfbe654a48919966793"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): jsapi/src/main/scala/dev/bosatsu/jsapi/JsApi.scala:44-53 | jsapi/src/main/scala/dev/bosatsu/jsapi/JsApi.scala:100-110 \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 \u0060jsapi/src/main/scala/dev/bosatsu/jsapi/JsApi.scala:44\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"jsapi/src/main/scala/dev/bosatsu/jsapi/JsApi.scala"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"85b56df41514ba72a3dcbe619fe95a0b773eabc3b1b39d9c5b8ad8389cf95dd5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:744-753 | core/src/main/scala/dev/bosatsu/Matchless.scala:808-817 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:744\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0fcc99cb8abe09e96538af9e6ee33541ff72a5680dc0c9cedc48b0b71c263fc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:829-838 | core/src/main/scala/dev/bosatsu/Matchless.scala:1451-1460 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1451\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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, \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1465\u0060 calls \u0060renameBinders\u0060 and \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:840\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":829}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6fad54846b7c42ef43d3a7edb270e061ca714f7b7328f002ab9543022724a3a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:9139-9148 | core/src/main/scala/dev/bosatsu/SourceConverter.scala:421-430 \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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":9139}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1c8fd55bed96c4faa1a6b5c6986041a03e5a148b472dad896d7186c4f4a2a7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:381-390 | core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:808-817 \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 \u0060core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:381\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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"37f0c7f08b5cb4f72217c8af4b9120fcb184b40f55a2195cfb74694c313b26f5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:817-830 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:967-976 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExpr.scala:817\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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":817}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac5ba3268c4425acdf7ef0ddf8050da883cc1f5c4fe54a60489a2b15f36d3caa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u201310 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala:946-952 | core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala:347-356 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala:946\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":946}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a294860065986bbf946e3ef50875495215c937dbb135e4ac49c7ca43eec967"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala:90-99 | core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala:279-288 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 37 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 \u0060core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala:90\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"84ddf8e309a8638f9fd5b1e904e5a7519ac8444c5067be2b105b685b16678980"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:97-106 | core/src/main/scala/dev/bosatsu/library/Command.scala:1314-1323 \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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:97\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"e24e30e61d733362ee5511833d71d4c77577ab2b180fe09d24a7dc2fb0dc4442"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/LibConfig.scala:1153-1161 | core/src/main/scala/dev/bosatsu/library/LibConfig.scala:1177-1186 \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 \u0060core/src/main/scala/dev/bosatsu/library/LibConfig.scala:1153\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/library/LibConfig.scala"},"region":{"startLine":1153}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fbcd732d69efbff6383b1b226d3ea7c9af933523af558e71f2f75aa9e962deb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:407-415 | cliJS/src/main/scala/dev/bosatsu/protobuf/ProtocPluginNodeMain.scala:20-28 \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. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"319069c71e6882192cb1361debbd47b3a8884f6d7bf1ab43323a013f71a4012f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:211-219 | core/src/main/scala/dev/bosatsu/Predef.scala:2219-2227 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"a01e73c4638e7f39ad3fd3798950ec3d27e03ed8a762476cfa8a0679748e0632"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:619-627 | core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:629-637 \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 \u0060core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:619\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":619}}}],"partialFingerprints":{"codehealthFindingId/v1":"d64260accc9a245f35ae9bd671435ffa2d151bc9b16b094aac1e9d071177d6b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1102-1110 | core/src/main/scala/dev/bosatsu/Matchless.scala:2991-2999 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1102\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1102}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4e2687761fcc686ad0c8d53bd8bebc5f28ac3888131cb9ff35541f82c4b7dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:348-356 | core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:775-783 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:348\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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"983790ab26d3b57a8821f1b2d696e5192bf32e6bdcdc3cfc95c952cc9addad9a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/PackageError.scala:1701-1709 | core/src/main/scala/dev/bosatsu/PackageError.scala:1724-1732 \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 \u0060core/src/main/scala/dev/bosatsu/PackageError.scala:1701\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":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":1701}}}],"partialFingerprints":{"codehealthFindingId/v1":"9031ab0c78609b8e8a6044cc28c6bc59287dfcebf894f5de6835ed8a64eefe03"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Predef.scala:4860-4868 | core/src/main/scala/dev/bosatsu/Predef.scala:4877-4885 \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 \u0060core/src/main/scala/dev/bosatsu/Predef.scala:4860\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":4860}}}],"partialFingerprints":{"codehealthFindingId/v1":"4da115c16ecd5da7abb7274757cee86fd90f082122aa6d5d6ad0e3f6994a56a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/SourceConverter.scala:2000-2008 | core/src/main/scala/dev/bosatsu/SourceConverter.scala:2041-2049 \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 \u0060core/src/main/scala/dev/bosatsu/SourceConverter.scala:2000\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2000}}}],"partialFingerprints":{"codehealthFindingId/v1":"42f1e8e796c70ac54d955994673788261e23b10c3073036fa6d58835fcd9aab4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/SourceConverter.scala:2083-2091 | core/src/main/scala/dev/bosatsu/SourceConverter.scala:2153-2161 \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 \u0060core/src/main/scala/dev/bosatsu/SourceConverter.scala:2083\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060core/src/main/scala/dev/bosatsu/SourceConverter.scala:2093\u0060 calls \u0060SortedSet\u0060 and \u0060core/src/main/scala/dev/bosatsu/SourceConverter.scala:2162\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":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2083}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4199793407b0da86972ae382609f9672a564acf58c850f43af9e4294047b272"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:2036-2044 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:2208-2216 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExpr.scala:2036\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":2036}}}],"partialFingerprints":{"codehealthFindingId/v1":"686d0a79d0b9e3a38e3d36a15eddcf48c0cbca2333d6278473a74dcabe035d87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:3617-3625 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:3644-3652 \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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3617}}}],"partialFingerprints":{"codehealthFindingId/v1":"6af448d43fcfb923fbf2c34bd3097dcd7cf5f0457669cc4a33d682a7ac104f87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/ValueToDoc.scala:50-58 | core/src/main/scala/dev/bosatsu/ValueToJson.scala:282-290 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/ValueToJson.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 45 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 \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala:50\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala:47\u0060 calls \u0060commaBlock\u0060, \u0060intercalate\u0060 and \u0060core/src/main/scala/dev/bosatsu/ValueToJson.scala:279\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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7032d26bfb02407ac7336da0fc7057f928bbc8dbe804f75179a66dacf04655"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/ValueToDoc.scala:173-181 | core/src/main/scala/dev/bosatsu/ValueToJson.scala:507-515 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/ValueToJson.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 45 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 \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala:173\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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"68347743cd25e0dcc558916f011bc654c17b1b6ec2e27673b2af3901c271c4c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:1873-1881 | core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala:148-156 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/library/Command.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/tool_command/ShowCommand.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 108 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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:1873\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":1873}}}],"partialFingerprints":{"codehealthFindingId/v1":"23efc16fb9985b77468428dc4655d8f9a50702cf57a06728e15bb5eeb60141ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20139 lines \u00D7 2): core/src/main/scala/dev/bosatsu/library/Command.scala:2241-2249 | core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala:35-40 \u2014 before extracting anything, compare \u0060core/src/main/scala/dev/bosatsu/library/Command.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/tool_command/JsonCommand.scala\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 59 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 \u0060core/src/main/scala/dev/bosatsu/library/Command.scala:2241\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":"core/src/main/scala/dev/bosatsu/library/Command.scala"},"region":{"startLine":2241}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a2efd7e93d455bad245a06f28684611d970a6d6c00b995efcd03180fc3c733"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:444-451 | core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:470-477 \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 \u0060core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:444\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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"65d466d64bfa754e68fe7c887a90e65738774f02239976f09cc89cc6e9bd2b42"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:450-457 | core/src/main/scala/dev/bosatsu/Matchless.scala:527-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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:450\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fddea2de8a05831dad725957e7d890c2407d1de5e16d3a12f8dba8fcd1611a4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:972-979 | core/src/main/scala/dev/bosatsu/Matchless.scala:1631-1638 \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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":972}}}],"partialFingerprints":{"codehealthFindingId/v1":"21fb3ba2551bc0f107fa345145305c9204f242b364d53bf4f59ee1ff2cfa1bed"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/src/main/scala/dev/bosatsu/ParserHints.scala:146-153 | core/src/main/scala/dev/bosatsu/ParserHints.scala:188-196 \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 \u0060core/src/main/scala/dev/bosatsu/ParserHints.scala:146\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/ParserHints.scala"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"26492582a459a1932c5b8e1ccd8a40bc86436aa1e2f318c8a44a46e30b81e24e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypeParser.scala:187-194 | core/src/main/scala/dev/bosatsu/TypeParser.scala:200-207 \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 \u0060core/src/main/scala/dev/bosatsu/TypeParser.scala:187\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/TypeParser.scala"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"96320f8d954ad5849b611964b5b4b82b7eba719bace7faf5d688dad3d1bd5fbc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:3783-3790 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:3816-3823 \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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3783}}}],"partialFingerprints":{"codehealthFindingId/v1":"782f26b67caea572b90487cf81708c90818552b5b1a70873c92fcf2c8b3e66fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:684-690 | core/src/main/scala/dev/bosatsu/Matchless.scala:756-762 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:684\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":684}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c13b4e77a26b902e69591edc95daa889cc48f3bbd5ae923da9e914b120e085b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:868-874 | core/src/main/scala/dev/bosatsu/Matchless.scala:1523-1529 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:868\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1531\u0060 calls \u0060val\u0060, \u0060freshName\u0060, \u0060updated\u0060 and \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:876\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":868}}}],"partialFingerprints":{"codehealthFindingId/v1":"26846dce91ed4761590633e5cf065a2f4a86d0efa73d417766fb50dfff04ded2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:955-961 | core/src/main/scala/dev/bosatsu/Matchless.scala:1614-1620 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:955\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":955}}}],"partialFingerprints":{"codehealthFindingId/v1":"d08d06431dcb2aa10c089ab46cab67a44a91eed30ad43f8f9d4c7fd5939fa849"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:6662-6668 | core/src/main/scala/dev/bosatsu/Matchless.scala:6710-6716 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:6662\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":6662}}}],"partialFingerprints":{"codehealthFindingId/v1":"081d8354c132dde4300abd7dad74498dae809e28f0173f9b36e6fc6fc61b168f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:7916-7922 | core/src/main/scala/dev/bosatsu/Matchless.scala:7932-7938 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:7916\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":7916}}}],"partialFingerprints":{"codehealthFindingId/v1":"490f6b5808037c15c3d8a5b928e37d9c0d3122251e59e5272278c29825f355a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:373-379 | core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:800-806 \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 \u0060core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala:373\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":"core/src/main/scala/dev/bosatsu/MatchlessGlobalInlining.scala"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"45d1b6fb31705ecc4b982bf60dafe8f993ec68d5434bc652910ecb78d9f4ae59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Pattern.scala:1142-1148 | core/src/main/scala/dev/bosatsu/Pattern.scala:1265-1271 \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 \u0060core/src/main/scala/dev/bosatsu/Pattern.scala:1142\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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":1142}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1b1f01b59ec873421d18b4562d0f85a256fe5fbbb3ad9cf538c527a79ca6ccd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Predef.scala:4395-4401 | core/src/main/scala/dev/bosatsu/Predef.scala:4410-4417 \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 \u0060core/src/main/scala/dev/bosatsu/Predef.scala:4395\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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":4395}}}],"partialFingerprints":{"codehealthFindingId/v1":"47d734fa34a0b3b296066460e20889e992479af33bef83fbdff7b4a7ade7fd16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/ValueToDoc.scala:106-115 | core/src/main/scala/dev/bosatsu/ValueToDoc.scala:183-189 \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 \u0060core/src/main/scala/dev/bosatsu/ValueToDoc.scala:106\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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"20ccb6ab8d127c1446d8777d33dec02fcfb4f2c93eac2aec51d630c7b2d50c15"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala:304-310 | core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala:318-324 \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":"core/src/main/scala/dev/bosatsu/tool/CompilerApi.scala"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"253648d1115cc3e6d1ce44ed54c6ca32948b067072132467cb9c2c6e1b673cbe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Pattern.scala:570-575 | core/src/main/scala/dev/bosatsu/Pattern.scala:620-625 \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 \u0060core/src/main/scala/dev/bosatsu/Pattern.scala:570\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":"core/src/main/scala/dev/bosatsu/Pattern.scala"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aa2d4f23aabd08717517aece23549a35bd73c046af7e12fbe4debf23c4a9608"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:839-845 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:985-990 \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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":839}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a69842ef7c0aebefcc6e51b2222c0bfd11fd6ae675b7c5f333ac4798c897a86"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:3564-3575 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:3662-3667 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExpr.scala:3564\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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3564}}}],"partialFingerprints":{"codehealthFindingId/v1":"0be0a34760fc75dfe411eb058cc338f77d7d2fcfe2b56d278381c16438e1a3b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1390-1395 | core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1425-1430 \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 \u0060core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1390\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1390}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2665fecdfc2a6b559eee0fd04a858454dd61f985cbe6c095493d1cb7766e84f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:983-987 | core/src/main/scala/dev/bosatsu/Matchless.scala:1642-1646 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:983\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":983}}}],"partialFingerprints":{"codehealthFindingId/v1":"606839b973edfc6e7a4b5962bc48fa6d12ca10e2cafc4a3b58fc053a7f56c823"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:989-993 | core/src/main/scala/dev/bosatsu/Matchless.scala:1648-1652 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:989\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":989}}}],"partialFingerprints":{"codehealthFindingId/v1":"f721048bc76a209464c14d0035b690d92d8666a7de63e8764983bd33f6db1811"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1528-1532 | core/src/main/scala/dev/bosatsu/Matchless.scala:1651-1655 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1528\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1528}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b75da460d0cedbd52cf03deb82463c74d7f1259d5db0a4bf3417cc51f83ec5f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (2\u20135 lines \u00D7 3): core/src/main/scala/dev/bosatsu/Matchless.scala:2744-2745 | core/src/main/scala/dev/bosatsu/Matchless.scala:2890-2894 | core/src/main/scala/dev/bosatsu/Matchless.scala:3042-3046 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:2744\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":2744}}}],"partialFingerprints":{"codehealthFindingId/v1":"70d4f6b661d657d88fd0ac8155c433585c54c6fd0c726f2c7c95086890eedfdf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:7094-7098 | core/src/main/scala/dev/bosatsu/pattern/StrPart.scala:267-271 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:7094\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":7094}}}],"partialFingerprints":{"codehealthFindingId/v1":"af5d26e73555f3c6db017ff73b9ce7317189ff3e1629b6a76c0b72d0aa4982a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/src/main/scala/dev/bosatsu/ValueToJson.scala:386-390 | core/src/main/scala/dev/bosatsu/ValueToJson.scala:401-405 \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 \u0060core/src/main/scala/dev/bosatsu/ValueToJson.scala:386\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":"core/src/main/scala/dev/bosatsu/ValueToJson.scala"},"region":{"startLine":386}}}],"partialFingerprints":{"codehealthFindingId/v1":"eea89878e6f1aed262e8e1c8230509246c8a8e262fb9c6e94a2371cd22539426"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala:811-815 | core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala:825-829 \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 \u0060core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala:811\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":"core/src/main/scala/dev/bosatsu/tool/ShowEdn.scala"},"region":{"startLine":811}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf93b1525680b3661ebbd50d0f820e2e8c27a7d7c75fc87f197dd0acf31b6098"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): cli/src/main/scala/dev/bosatsu/CheckBenchmarkMain.scala:120-127 | cli/src/main/scala/dev/bosatsu/EvalBenchmarkMain.scala:120-127 \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":"cli/src/main/scala/dev/bosatsu/CheckBenchmarkMain.scala"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac3be600415086f59d463976f77a6efa2b249fac80a7f8d45380f4b2b23250f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala:417-425 | cliJS/src/main/scala/dev/bosatsu/protobuf/ProtocPluginNodeMain.scala:30-38 \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":"cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f4bc7c6f2cdeafd14da56fd59093cd641f263651a68db8895beafb9f0ad29b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:183-188 | core/src/main/scala/dev/bosatsu/Predef.scala:1406-1411 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"29bfeaf588858759723a53d31823c9779cc33fc35d86fd0825841bdc6e9adfd3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:195-203 | core/src/main/scala/dev/bosatsu/Predef.scala:2203-2211 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f75b3a9fce7f2ca425c51414b0cd03656b0292699151198076f7113f88c2b17"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:285-289 | core/src/main/scala/dev/bosatsu/Predef.scala:2715-2719 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaaf7f2e9424fbd31fdbdbf54ce85acaf465f86c12aa7d78128191556057960c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:295-299 | core/src/main/scala/dev/bosatsu/Predef.scala:2036-2040 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8b70d02ad72ae877d287df064bde2b01f5fda9993bc9db0bb509e46621bc4be"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:305-309 | core/src/main/scala/dev/bosatsu/Predef.scala:2046-2050 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"241dc8d1c1570bdb282f52033b5c21e33c960de6c5279891d2b9606ea6ee20cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:370-376 | core/src/main/scala/dev/bosatsu/Predef.scala:2063-2069 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"5072a2d8563ac3b8bab75d09b8bc715fd021112c08b094c695ce8dcc180fa0aa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:379-386 | core/src/main/scala/dev/bosatsu/Predef.scala:2072-2079 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":379}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c29541aa544f42b390b6a3548c4c35f2964fb1fe6e293cc059c000e36a69df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:395-402 | core/src/main/scala/dev/bosatsu/Predef.scala:2088-2095 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":395}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b373963a37b844ef3241a56943aa5aa8058ee2b1d14285bfbb963663cb4a110"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:407-411 | core/src/main/scala/dev/bosatsu/Predef.scala:1863-1869 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"4061bbda3298a9855c8e279f68265c2c23c355b32ea338bea1c897ea91883beb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Json.scala:25-29 | core/src/main/scala/dev/bosatsu/hashing/Hashable.scala:87-91 \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":"core/src/main/scala/dev/bosatsu/Json.scala"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b74347721448b71fcec6b9867025db8b17a9054b72924ff6da2dd34f64a349b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:268-273 | core/src/main/scala/dev/bosatsu/Predef.scala:1974-1979 \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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6d6a6f60ce0e9795a00d9b4c563c1864d8fb2466b07972add8592ac1068348a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:1365-1369 | core/src/main/scala/dev/bosatsu/Predef.scala:3015-3019 \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. Read the line range as the matched WINDOW rather than a finished unit: at \u0060core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:1365\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala:1363\u0060 calls \u0060unsupportedProg\u0060 and \u0060core/src/main/scala/dev/bosatsu/Predef.scala:3014\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":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":1365}}}],"partialFingerprints":{"codehealthFindingId/v1":"739b51c05a09aa53467fa1a2bb21431f7b47c3fc56a9e6794fe8a16bcf5ffff8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:703-710 | core/src/main/scala/dev/bosatsu/Matchless.scala:771-778 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:703\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":703}}}],"partialFingerprints":{"codehealthFindingId/v1":"0157f91f323b55008179d3186f1c855b264d38af1a09fac80f82e5618b9828c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): core/src/main/scala/dev/bosatsu/Matchless.scala:1088-1093 | core/src/main/scala/dev/bosatsu/Matchless.scala:2977-2982 \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 \u0060core/src/main/scala/dev/bosatsu/Matchless.scala:1088\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":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":1088}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b9ff3500c3730e68ded8bb44e872516b3bd8dd4c57c763e47a5db460e3bde29"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): core/src/main/scala/dev/bosatsu/TypedExpr.scala:3478-3485 | core/src/main/scala/dev/bosatsu/TypedExpr.scala:4109-4116 \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 \u0060core/src/main/scala/dev/bosatsu/TypedExpr.scala:3478\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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3478}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c449e81146d3178e26d185d45a00aadd9f91e824d9e1fda5b818a62074629ff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1367-1371 | core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1404-1408 \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 \u0060core/src/main/scala/dev/bosatsu/rankn/Infer.scala:1367\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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1367}}}],"partialFingerprints":{"codehealthFindingId/v1":"96fca0158c59c5609ac5c29d6c7e68b4c01085233a7eb0b91035ba19aa97501b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): c_runtime/typegen.py:22-35 | c_runtime/typegen.py:41-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":"c_runtime/typegen.py"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"52a16a14eda262d7c1f0c48a4631fcac1871ccfffdc77bf82e5ce5a4c42a08c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): test_workspace/ProgExt.py:1832-1845 | test_workspace/ProgExt.py:1871-1883 \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":"test_workspace/ProgExt.py"},"region":{"startLine":1832}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cff182acc09e439534b22b32c45ecdd11582bfd1026d1dce2cfbf1bc98a5b99"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): test_workspace/ProgExt.py:1161-1172 | test_workspace/ProgExt.py:1205-1216 \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 after the matched lines, \u0060test_workspace/ProgExt.py:1218\u0060 calls \u0060bytearray\u0060 and \u0060test_workspace/ProgExt.py:1174\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":"test_workspace/ProgExt.py"},"region":{"startLine":1161}}}],"partialFingerprints":{"codehealthFindingId/v1":"366393b7b64118178e555a6a22ed29c5f62393b48294d42ecdffa37673e6b9e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 3): test_workspace/ProgExt.py:1048-1056 | test_workspace/ProgExt.py:1163-1172 | test_workspace/ProgExt.py:1207-1216 \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. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060test_workspace/ProgExt.py:1218\u0060 calls \u0060bytearray\u0060 and \u0060test_workspace/ProgExt.py:1174\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":"test_workspace/ProgExt.py"},"region":{"startLine":1048}}}],"partialFingerprints":{"codehealthFindingId/v1":"32f5dd8984df71577e12c64e0a67652ef5ee38974311ac703f876f6a439894e9"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: base: base: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 4 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"097d8f81de5fdd75d5bb37d492711a27c584fe359ba35baafbc925ff9d0acc98"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TestBench (LCOM4 4): TestBench\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":"bench/src/main/scala/dev/bosatsu/TestBench.scala"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dfcb92fd605b2c2603309ba0c2dd82d5bfc1ffd125cc4d932013118034cf728"}},{"ruleId":"D7","level":"note","message":{"text":"Checkable ADR rule enforced only by prose: Issue #1738 Design: Hoist Loop-Invariant Lets Out of Loop Bodies: ADR \u0027Issue #1738 Design: Hoist Loop-Invariant Lets Out of Loop Bodies\u0027 declares \u0060enforcement: prose\u0060 but states a rule a test or analyzer can check: \u0022for \u0060Right(name)\u0060 binders, loop condition must not reference \u0060name\u0060.\u0022 Nothing in the build fails when the code breaks it \u2014 add an architecture test or analyzer (and \u0060enforcement: test|analyzer\u0060 with an \u0060enforcement_link\u0060)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1738-hoist-loop-invariant-lets-out-of-loop-bodies.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"369b5f81c4a64c9d647ee17b1379cd6101acf34be8eff4388e6b66dd53d4f86b"}},{"ruleId":"D7","level":"note","message":{"text":"Checkable ADR rule enforced only by prose: Issue #2224 Design: Minimize \u0060core_alpha\u0060 Exports: ADR \u0027Issue #2224 Design: Minimize \u0060core_alpha\u0060 Exports\u0027 declares \u0060enforcement: prose\u0060 but states a rule a test or analyzer can check: \u0022Verify a downstream source cannot import a removed package such as \u0060Bosatsu/Num/Nat\u0060, \u0060Bosatsu/Dict\u0060, or \u0060Bosatsu/Collection/Queue\u0060 through the dependency interface.\u0022 Nothing in the build fails when the code breaks it \u2014 add an architecture test or analyzer (and \u0060enforcement: test|analyzer\u0060 with an \u0060enforcement_link\u0060)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dbc410ceb728fd860ec986bba593cfba6e951e1feb8eb180af8889871017cbf"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 91 significant file(s) lose their only recent owner: core/src/main/scala/dev/bosatsu/Matchless.scala, core/src/main/scala/dev/bosatsu/TypedExpr.scala, core/src/main/scala/dev/bosatsu/Predef.scala, core/src/main/scala/dev/bosatsu/TypedExprRecursionCheck.scala, core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala, core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala, core/src/main/scala/dev/bosatsu/rankn/Infer.scala, core/src/main/scala/dev/bosatsu/SourceConverter.scala (\u002B83 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"49017a034f96e547793f5d715617338430af314ee0332b3e3a88feaa0f982609"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO, maybe give a 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":"core/src/main/scala/dev/bosatsu/ValueToDoc.scala"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7fc39654bfa061633ab21a53af57ef03dc1dc00edc6741b3a1b35dd69646707"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we could cache the a table of small values to reduce the double allocation 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":"core/src/main/scala/dev/bosatsu/Value.scala"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"bce20d338b2fd62b13b974ab101ba6cc36167df0ae3b37a08b914e47d29cf0f4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: patterns need their own region (https://github.com/johnynek/bosatsu/issues/132)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/UnusedLetCheck.scala"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"be962c4fdca15cd8a0ab4c0662e7ddd38ebe7ee8ede038a5cd7e44ed5bdffdc8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we could reorder Lets if we have several in a row \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1637}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c60b2bd66722d506de8aa79dafb3f4c10f6d5cadb7ff2c587a502e347a37dfb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we could look in the scope \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1706}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bc3d0b160d9449f99800f39d861c4e1e06a8245dc8f014a8abeea756aa24d7b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we could implement much of the predef at compile 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":1715}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6542e7d88d00111637bc47c49faf1f7618e4eac1c552f88ee46da06a01bb03"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we can still replace total matches 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2047}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e6cd11bcd6b44c566c607cebf85b42929c6df4a3ce40b430920bcfc7d78de2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we may not have a proof that m2 is smaller \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2156}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ca452018a05bf46162bfd68dc3f8869684bc02f1726354a348ff58994062c36"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: don\u0027t we need to worry about the type environment for locals? They \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2247}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa9ffb7f09bb2ee9675a3c7e87fbcc0644a2112a0dae0d8f7e247de0d9141030"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO some of these patterns we could evaluate \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":2983}}}],"partialFingerprints":{"codehealthFindingId/v1":"6db922823305fd016535d2338e5765b973ea6d7c6925e4e7db38e216bad41218"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO hitting this looks like a 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":"core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala"},"region":{"startLine":3104}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab6e6f74e8288ff16dd59a503f7c078eb8528f3f997c1f422d63a086337d8792"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we need to make sure this parsable and maybe have a mode that has the compiler \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"81f75b7455f47adfa4ecd7ffb29c69314964f6729e2150244a87330fa6736427"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO, this shouldn\u0027t have a type, we know the type from Lit currently \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":1002}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd2bd8041eeb2583c5ba64ed8bb017823d6807aa417dc341019396eed1cedab1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO some of these just don\u0027t look fully unified yet, for instance: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3292}}}],"partialFingerprints":{"codehealthFindingId/v1":"48b3ada658d595be5b89fcd6c7d0add0110bc5dd0e047bd1bdd20084f8c9107b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO, what should we do 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":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3469}}}],"partialFingerprints":{"codehealthFindingId/v1":"35f79dfba4afe81ecbc8aa0d02d4f77dbbc5668ff3b2ae7260c077a8ccf994a2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this may be wrong. e.g. we could leaving meta in the types \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3488}}}],"partialFingerprints":{"codehealthFindingId/v1":"874e20afcabf6463d13d3fadbc8585a0169f93e5fbc004ebaaa8c0ee228f5a27"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this may be wrong. e.g. we could leaving meta in the types \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":4119}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e37f489de0ef7a95bf599346c62f4a6178819d5cdecc29e67a30f6def4c770"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this isn\u0027t great but we just need to get the free vars from the function \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3576}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb70b30c87a2d2c71325f8627c44f54176014307515ad2a141a81075495cc137"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this isn\u0027t great but we just need to get the free vars from the function \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3619}}}],"partialFingerprints":{"codehealthFindingId/v1":"e87bd83e77e879c64f7fe63a915841830e4d209b11556349edb2c287374748e1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this isn\u0027t great but we just need to get the free vars from the function \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExpr.scala"},"region":{"startLine":3646}}}],"partialFingerprints":{"codehealthFindingId/v1":"29fb5ee363ca87ad90aab315b7f35391d6b7026bced2d7ac76856265ca77587d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO, we could normalize the parmeters 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":"core/src/main/scala/dev/bosatsu/TypeRef.scala"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"7967e5c8a9974a42034432b964fd36c05d4689ca8bb92e3fc564fb618064c11a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO, we could normalize the parmeters 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":"core/src/main/scala/dev/bosatsu/TypeRef.scala"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"839672f579d8e9f5cdad09f2cd05d6a48c385dd3f02937bca6f51785561f625d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Keep identifiers \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Statement.scala"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c50220edecf10a700cb3377d78646d6fb5ff49ba896d7ce0cd7570222c7630"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we need the region on the pattern... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"a789937c6c5b8e1ce1c7b6a2f059dfa8326db1d7914ec2ae305a032387b7a169"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we need the region on the pattern... (https://github.com/johnynek/bosatsu/issues/132)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":735}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba299239d5f19a139e2f8f87da6b05c9a08136a0586563cfb9727e93f1649bfe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we have to make sure we don\u0027t have more than 8 arguments to a struct \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":1519}}}],"partialFingerprints":{"codehealthFindingId/v1":"d126e605a8ce6ee5924939b45f39ed2fc110ae7d0013da99bb3203683bcd09e5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO make a better name, close to the original, but also not colliding \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2673}}}],"partialFingerprints":{"codehealthFindingId/v1":"a98097f64c1bd05b6dd7efe182f25d4a39dc23d9ed4f801ccb8849c00fc41901"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we could implement Iterable[Ior[A, B]] =\u003E Ior[A, Iterble[B]] \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/SourceConverter.scala"},"region":{"startLine":2873}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d60a80f64b6f2b612e0277fad77cbbeb9e3576bc6e7113e9727a3f8afe34e55"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: if we move this to object Expr and take Hash[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":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":699}}}],"partialFingerprints":{"codehealthFindingId/v1":"1405ee51354d2eeb82790cf5fed2f581c3f81fd611abb856a445bc9015af8736"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we should never get here, increasing cost by normalization \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/RingOpt.scala"},"region":{"startLine":1714}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb5ba2f1528ee367ecc57947f47710b9b6b7d41c286477098d7379655bdc45cb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we should use the imports in each package to talk about (https://github.com/johnynek/bosatsu/issues/4)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0a43f256053fde117d72cd16c8e3322817bb77dd1e44502bc145b32c8fd4b6b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: get printing of compiled patterns working well (https://github.com/johnynek/bosatsu/issues/4)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":1786}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff656314d623ff10b1a3f32cc2ef82d22bbef8928230622fda0353ea4507c8c0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO use the sourceMap/regions in RecursionError (https://github.com/johnynek/bosatsu/issues/4)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/PackageError.scala"},"region":{"startLine":1937}}}],"partialFingerprints":{"codehealthFindingId/v1":"15f7f2f41e91665220bd5f0547b9d1eef87dedae1f1cf5d4aad902ec2d5b4563"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: App(lambda(while \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/MatchlessToValue.scala"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"5842091a969b68d6c983f778536cf67a2520bea8cd4f262aa232efb73edf7a39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: sometimes we generate code like \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Matchless.scala"},"region":{"startLine":7386}}}],"partialFingerprints":{"codehealthFindingId/v1":"6901e561814d19cc61f02420adee67980051420cbbbde3a4231b202a01762cf3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: use paiges to pack this in nicely using .group or something \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Import.scala"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"a36d890a21830bfaab11fff11b41f8d2588e8c3af27c954675ff3245cb7f9366"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this only works for lets, not externals (https://github.com/johnynek/bosatsu/issues/186)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Evaluation.scala"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"659066c3c56d6b108026367fada52e57ca8d3a53610ef5f950f3701b1950f352"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this isn\u0027t quite right \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"16ba46e259616fb3ea7c7a1dda6ff6eceb62128b0e1b343e26daa2dbef7994da"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we should keep the pattern region (https://github.com/johnynek/bosatsu/issues/962)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":1538}}}],"partialFingerprints":{"codehealthFindingId/v1":"d941c93619d2f48909367c0f68087d23b219ca3ee88cbfb55b4e41555f80dc3a"}},{"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":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":1593}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd33406c7d00f947096f2de3047b7e5939522c99b61d34bfa3cf83b5af6c3aac"}},{"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":"core/src/test/scala/dev/bosatsu/rankn/RankNInferTest.scala"},"region":{"startLine":1049}}}],"partialFingerprints":{"codehealthFindingId/v1":"a82d731cf8e10b20f92b351a2e79e25ede903ecfe9b3c3f02ca30419864245dd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: aren\u0027t NonBinding independent of indentation level\u003E \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":1607}}}],"partialFingerprints":{"codehealthFindingId/v1":"4462b104090ded8635a063946dbe75f8b6d07c026a63cd97a3823c0667dee9ce"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: the backtrack here is bad... (https://github.com/johnynek/bosatsu/issues/344)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":1648}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7377989b6829a3ca20fa6488ae5b18295f0506395c129ffe409feb4b2b684d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: comment is ambiguous with binding/non-binding... (https://github.com/johnynek/bosatsu/issues/326)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":1691}}}],"partialFingerprints":{"codehealthFindingId/v1":"877898c9491cb5234bc9f528231dfd3142af618dd0f148a438ed26f342047fc9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO remove this backtrack, (https://github.com/johnynek/bosatsu/issues/344)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Declaration.scala"},"region":{"startLine":1755}}}],"partialFingerprints":{"codehealthFindingId/v1":"17d477b39bdbef41ae6d80299fa375882f407470deb4f2d8fa71b61dbdddaff2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this should really e checking that te.getType \u003C:\u003C a key (https://github.com/johnynek/bosatsu/issues/430)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/CompilationSource.scala"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"36376454be6c7d910dd0e0f840546bd41f4e6aa1585aa9cf00ec07b82c15f8aa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this should really e checking that te.getType \u003C:\u003C a key (https://github.com/johnynek/bosatsu/issues/430)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/library/DecodedLibraryWithDeps.scala"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a1d7ce6aea3ac9750f1fbcc9bf12d259784dcf43ac5110c335a3bb3a84b3db4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: not all onExpr uses have this type, we need to take type argument \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"3859bf55a1710b8af9c33dfd4619c54f320c4f3d9227720f7d59ca1a0f215f40"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: not all onExpr uses have this type, we need to take type argument \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3271bc54abb009faab35a3f1c2196d3ed8548755251429265d30b2a2961dd56"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we can do a lot more 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":"core/src/main/scala/dev/bosatsu/codegen/clang/Code.scala"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"21f55ea8643b8573da7e6ad0ec0f9b599b7b5a42d2385c4fae85b09de09f92a8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // ??? TODO report the key in a sane way \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangTranspiler.scala"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"2894bae0f62bc97e778fc4138b281961373e1c50046baf4d2744864fa4a56517"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: we can generate more efficient code by evaluating this when possible \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff2e9db2a268bf310a2d0eafbcce7c05038b3f4c53e0a2299f31fea838274c8d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: if we can create the value statically, 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":1216}}}],"partialFingerprints":{"codehealthFindingId/v1":"3848cc3a75a30579199374d7e13d9ed2cb304cdf8e4fb02bf3d13d737fb6f99e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: if we can create the value statically, 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":1237}}}],"partialFingerprints":{"codehealthFindingId/v1":"55d71efc62127eaddf5f6a7bde3f543e9f28a12d21623d065643e5afdb2af79b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: suspect that we are ignoring arity 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":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":1442}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4fa807c85625f613f6fdba895b3099a2424126add60cf97172fb2c1e7ca0b25"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO, we don\u0027t check that these types even exist in the fully \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/python/PythonTranspiler.scala"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"74e64c9b99e4f38907314b0ef3cc51cc3fc812100e6e84d246a217a6eb99c23d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: if body isn\u0027t an expression, how can just adding a lambda \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/python/PythonGen.scala"},"region":{"startLine":3298}}}],"partialFingerprints":{"codehealthFindingId/v1":"d50a4ccde6234644426540b5a72b2abc9893d5deb2c24e299712ac767b404f6b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: when exists becomes tau, this needs to change: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dc953bde399af6aaa60e2fef4eb019af8d903e2b9b0796a4835218405ed325e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Kind/existential \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":2022}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f1b4f606efe33d3d0b9636c8286ae44a86aba519a6adf951af76efefa9d388a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Kind is wrong \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":2030}}}],"partialFingerprints":{"codehealthFindingId/v1":"a42a74e3c133731bf4260d605e5f58da8a800317afb01dd8db8631d23372a1c7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO 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":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":2081}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f7a8cc87d0190176458de884079770bbb7c47a2efe424a863e77e022c616479"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Kind and if it is existential \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Type.scala"},"region":{"startLine":2086}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ea3a74c41ee6c17ff87dc190299b4088ff2c88b0c84e2d83133b4f4bc5c2718"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: it may be possible to improve type checking \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":862}}}],"partialFingerprints":{"codehealthFindingId/v1":"342a42c5677ae34407c7bbe00c9144c3ca3d5144fac544e8263836a97919402c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this coerce seems right, since we have unified \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1144}}}],"partialFingerprints":{"codehealthFindingId/v1":"81c46b791648d289aae6d16e94671f9dbfe0d37c3147d8d276247daff8a66a7b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: it would be nice to support kind inference on skolem variables \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1470}}}],"partialFingerprints":{"codehealthFindingId/v1":"0386819548194f7e248aa38b0266d372bb21f5389e51be153525a308bb8ab0e4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO maybe this function should go ahead and quantify \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1588}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f5d37023c39289336660aac4b812cc5d5acd69d1ce9e8ace81cf9eba041ddd1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we could support frees it seems 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":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":1955}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb48445a56844e4a7ecc2c7d88d839d778ca2a057fb1b8e633d94007e8e6b06c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we could use the args to try to fix these \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2024}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4e6697ce1280c4972a89f045726075a9304c0420766f7d2e677f923a3ec090a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: a more efficient algorithm would do this top down \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":2485}}}],"partialFingerprints":{"codehealthFindingId/v1":"94beae5f14b93ca7626dde419a67c1946571c4133faa2d6bba5d50dd4a5eb1c8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we should be able to derive a region for any pattern (https://github.com/johnynek/bosatsu/issues/132)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/Infer.scala"},"region":{"startLine":3184}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8e81d8ffeff3942bdf0f74636f0e78f8f569cfe479ab728d4cf2cf988d76166"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: optimize cases where all enum variants have arity 0 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/rankn/DataRepr.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a8cfbe9a39071cadcc058dd9fd3d4f040666be4ec1d83899dd4606bb37d238"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO currently we recompile predef in every run, so every interface includes (https://github.com/johnynek/bosatsu/issues/414)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/tool_command/CheckCommand.scala"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"74c06eb37e69cb3e7199081fb62c3178f162e2384b9db578eccf0148b3582700"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: WellTypedGen likely under-generates accepted recursive defs, \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/TypedExprRecursionParityTest.scala"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b4a67ad9886bff88969352f8e6c448a325ba18aee8ed4b341f9e2296a3511be"}},{"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":"core/src/test/scala/dev/bosatsu/RingOptLaws.scala"},"region":{"startLine":878}}}],"partialFingerprints":{"codehealthFindingId/v1":"f680f004acacc6635c7e03e46b8439ca1d62794e49586293a6acd90e6bd6c018"}},{"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":"core/src/test/scala/dev/bosatsu/Gen.scala"},"region":{"startLine":877}}}],"partialFingerprints":{"codehealthFindingId/v1":"53b6eca7a1346bd88de58c28210300a16058c3a7c054c682447b7609d97906b9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we can\u0027t always do 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":"core/src/test/scala/dev/bosatsu/RingOptLaws.scala"},"region":{"startLine":932}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8b18be7dc87a2db3b719dfe241044b743db1faaa926bac3702d897b7649b293"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: we can\u0027t quite always get here yet \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/RingOptLaws.scala"},"region":{"startLine":962}}}],"partialFingerprints":{"codehealthFindingId/v1":"40bc2814a63171cc2d076e1841175c9e610e8a5060bf2937241da785f62288f8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this test doesn\u0027t work well with basicNorm which is still unsafe \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/RingOptLaws.scala"},"region":{"startLine":1434}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dc4d9a8cf233f32d29a8c0b494ce213f6e1110eb88bc5f9ee944380305a7f19"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we can\u0027t parse if since we get confused about it being a ternary expression \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/Gen.scala"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1d404742c781748fb02c653a06fc8c649c532744616608c2af74c2828f64b55"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we can\u0027t parse if since we get confused about it being a ternary expression \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/Gen.scala"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"34e0753030944c64e533fa6d5cd0b79a296d73d73977fb489c4eb6dc64e7e747"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this should pass if we use \u0060foo.bar(a, b)\u0060 syntax \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/Gen.scala"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"b69633e5ca1dcb40b2ff3578efc2cff9138cd4af48dc8711fd2f7c295e8c5ffb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO support parsing if foo: bar \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/Gen.scala"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"7994c25d84d283ebb1b8b599bb3d5e8f96a081c591833100fbbbcc46462f59d5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo, we should really interleave shrinking r and b \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/Gen.scala"},"region":{"startLine":1091}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e73354983bdf31a879f595f2342c76761be58c34da41f9db926ec85470f47de"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO make more powerful \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/Gen.scala"},"region":{"startLine":1364}}}],"partialFingerprints":{"codehealthFindingId/v1":"f582eee871a5b745e78b00b59e7fb955927eb76566e202c75d5481ae8fbf229b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO, maybe import more... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/Gen.scala"},"region":{"startLine":1785}}}],"partialFingerprints":{"codehealthFindingId/v1":"67e4408adfd17efa5987a94bd40c6ca57ef02356d0826c0fe7269e9beecbfabb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this fails \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/pattern/StrPartTest.scala"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"89a426a00d95f74d9c7fc25e8c455337c9b0f10de0a45c1bb30c9de443a52413"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO send some error message \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"jsui/src/main/scala/dev/bosatsu/jsui/Store.scala"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"f18e7c9f7515ca3a6aecea81d839ef7e62ab8f90f016af15ff357e03def1ec29"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/1173-add-a-todo-function-when-running-type-check.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1173-add-a-todo-function-when-running-type-check.md"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6c0b14b9e5bb0f72126c3885f825fb9f20bfa9d9f960308a5594bec7f5e8e74"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/1770-design-post-typechecking-recursion-checker.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1770-design-post-typechecking-recursion-checker.md"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5ad79c3fec0858d6795255cb5ac8cc130c6455abd92642d767e18ae741c96a"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/1798-require-shadowed-bindings-to-have-the-same-type.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1798-require-shadowed-bindings-to-have-the-same-type.md"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fac76b427c8c77b4c2883dd1e24e9fe807d144816c200701de9c1ae20efac55"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Decision and Consequences section: docs/design/1908-lib-build-should-allow-only-giving-the-e-exe-out-option.md has no Decision and Consequences section (a heading such as \u0060## Decision\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1908-lib-build-should-allow-only-giving-the-e-exe-out-option.md"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"045e08223a0c3d6028f500cfc4b2c15179bb06a10bae613bccbf9de059cf959e"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/1977-improve-c-small-int.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1977-improve-c-small-int.md"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f667fe03ce6182b0ada328e5bf481387d56015545a402bfc1c204cd4065d220"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/2025-extend-recursion-checking-to-accept-earlier-adt-elements.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2025-extend-recursion-checking-to-accept-earlier-adt-elements.md"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c20c13fdb4131d4e58be970397c7c1487ac7aa993237a9017ff81b04fd2e731"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/2047-matchless-matrix-replace-fixed-leftmost-column-choice-with-scoring-heuristic.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2047-matchless-matrix-replace-fixed-leftmost-column-choice-with-scoring-heuristic.md"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"17d134249341f488fb287ecd88d18788390adbf1545ce3cb5b4cf4b53987c0ec"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Decision and Consequences section: docs/design/2073-add-doc-base-urls-to-libraries.md has no Decision and Consequences section (a heading such as \u0060## Decision\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2073-add-doc-base-urls-to-libraries.md"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"f22d3b6bd66488faa9906e277c70b3c3c4f1a3d3dd707ba2e67110aab34fcb72"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/2084-design-a-benchmarking-blackhole-function.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2084-design-a-benchmarking-blackhole-function.md"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e5c3dd01e3c26828af74c743b0055d4239c50e8d7bd89549dcf1df6f176c018"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/2103-allow-recursion-on-thunk-and-lazy-evaluated-data.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2103-allow-recursion-on-thunk-and-lazy-evaluated-data.md"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"d06d4d0554cf4a8d835494322ca3c7ade3b6dfa84026ef4c78dc804969cdc79a"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/2106-switching-on-integers.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2106-switching-on-integers.md"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ca02eed91c54b42a257df386bb17aadd94335b2f723b025e77c3acc66729d59"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Consequences section: docs/design/2216-remove-unsound-cast-in-compilecache.md has no Consequences section (a heading such as \u0060## Consequences\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2216-remove-unsound-cast-in-compilecache.md"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e8f1f9346bb925db33be4edf4b2ae1291851bf7c63a66e3dbdd31b338c2d1d2"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Decision and Consequences section: docs/design/2274-add-matchless-support-to-show.md has no Decision and Consequences section (a heading such as \u0060## Decision\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2274-add-matchless-support-to-show.md"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd312d80ab8fcb65d8acf7dfeeb8112b518cbbfca1a553663c75d10ce5eb05b0"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Decision and Consequences section: docs/design/2365-specify-the-portable-process-stop-and-status-contract.md has no Decision and Consequences section (a heading such as \u0060## Decision\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2365-specify-the-portable-process-stop-and-status-contract.md"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"61a9b79a7fccff29453694eb13ba8c1e3bbf3c6689da631db42199f551c9063e"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Decision and Consequences section: docs/design/414-consider-implementing-caching-of-compiled-files.md has no Decision and Consequences section (a heading such as \u0060## Decision\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/414-consider-implementing-caching-of-compiled-files.md"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ee2c7442bcb97ca6b55556e04031082a75f0b7816b65919dfa4939fed6a6aa"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Decision section: docs/src/main/paradox/design-docs/compiler_leveraging_type_inhabitedness.md has no Decision section (a heading such as \u0060## Decision\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/compiler_leveraging_type_inhabitedness.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"36b541f0dc74a5758db56af2c22692b8964cf35e04254d35ff4e0ed09b20aaee"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Decision section: docs/src/main/paradox/design-docs/prog_concurrency_design.md has no Decision section (a heading such as \u0060## Decision\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf86b5e01138e9ebfcf4e99ea8f61b84889ee36626f5f2fe5412a23969b9d153"}},{"ruleId":"D20","level":"note","message":{"text":"ADR has no Decision section: docs/src/main/paradox/design-docs/quantifier-evidence-design.md has no Decision section (a heading such as \u0060## Decision\u0060, or the MADR equivalent). A decision record states the context that forced it, the decision and its consequences, so a reader can tell later whether it still holds."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/quantifier-evidence-design.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46cac45bd931ae55fada912229fd632bfc398d5e1cf9979346cdf4924306b69f"}},{"ruleId":"D20","level":"warning","message":{"text":"Decision and consequences are present but trade-offs (e.g. vendoring libuv adds surface area, static linking burden) are not stated: Add a Consequences section covering the trade-offs of adding a vendored C runtime dependency (surface-area cost, build/dependency complexity), the static-linking burden on the C backend, and how existing Main/Test behavior is preserved"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/roadmap/2340-add-basic-support-for-libuv-in-c-backend.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fade70fad79bfd549e7a616a0e7340f9529c00527f8b210c61fd62e0e2f1bf4d"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 1 of 1 project(s) overshoot their size bounds, lowering Project Cohesion to 0.0/10. The most over is \u0060(repository root)\u0060 (102374 LoC, 1625 module-visible types across 32 directories). Review these for cohesion \u2014 draw the boundary inside the module first (group each responsibility into its own package or directory and keep the cross-boundary members non-public), since splitting a published package moves types between packages and breaks consumers."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d5a94650dc74886a0f1f08eb9fb6775f1fc395279ef7e901c970c9d26f767a72"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"80832ae47d071aff6bb4de08819d3ef5321278e799889050a27bc4ea219a7911"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a17036fbc973650ea2c2ecd1eae167d26b37f9cc4828daf6ac99f4147a638462"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d56e0b4e6f13b74d3a472a05f722cfe00059af1339db2a6197a8d3cfd9216ea3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"565cc464e7b238ceaafa7c16ee6648c7ca85668f3b399d192969438ccb5de285"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5cd4f97e1c9f3b69abac20b509c90e5fe2d90c2de23a6523690b431c62c73ef0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3af8f15d39d70295d4ee0b67f3dc9c29d4adaf0e7f7a5850f939f19c521e1202"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1593f3ecf1ae07bdda422181f76e441e6c4ac91256e0a37faca2a639821bd327"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f7260107f2d1ba4915a39dabb01e7e87a33ff904aa954ffd82d42f3607357c56"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"33b03c8c2325d58ae60f6d4bc1194cbfd2257aff41e350debfecbf4cb4e47682"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3e33e3d1ad33d2c68e73d4a15926c0de6b54004a40e4100961dc0daf823a3b03"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ab5717e698a0cb02778a29fa8c0eed3e335319bb29050d7470ef5080b82bc1c1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e479d64d6d2db90c0048f81da09efd64ab5fcba433cb8dbb234a61c00ea9ca37"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"186518b11fc4e21247dddcf73ca8656d577671469715297d71b9f38c79c731ab"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f5995d016e8c57b3f37703b95ac9db3a1cb18a89bd7a7edea5088189281d8cd1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6c8fdfc0c64bcd6130656880dbf9d3ad1f4b4ea6e05c3734ef407eb791e05c8a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"beffc34cf43726d3bc80012db3bc6a4fb5a9d0daa6611059b3c71e5fa5a58d8b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c717b15fcde1450894ff0f352c2de6a8be3b03420ec472ff8788be118b6d948d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"edba59b7daf91b64b43b248a7f3c3c105b69925d0a3f969366da51d81d3e670d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"072f1ce6ba624d973d7054e820583aa8d6c5f9994e7350bb5d751a62200f22e2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7a281dae696f3299656180b706af580b390aa115c3b3f82f4fee80e122709651"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"acc00b96823036fbc188e0d03eeda2488906b07772a7d02c413c2dc2bd7a3eef"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d2e6b6dd5025a1a60a36a0103ec4f8ceca4534df2480901c281f39d9dbfa4a7b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bf6e654aae86dc886c5a2e651d1be07a1252f28560ba57c82c6b15ac3d1f9c30"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"96f88121b035a898a6759141862415469563ae4858d3bd2449d90d5e5ba04a57"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"85280bafcbdf29636574874f5bbf71d926276a1c8a1c0092b3f5b3fe5849ee74"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cf13a5c965d2cfe7fb10727c383ecb003ca2fe42ebc44d6b342500458f1e8d8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"be5cae2d6b891caf7b9f085ac160ceeb932d9ee46122380c1253dd11842ac37b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"667a86f857af5efb122f2bed667c3223fc502ab7a1f2d9e90c5bd890c997c8af"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"dd9082b7c2ae8b05a4bb0f99ae9eab42442d6f9e12fa40578991ed97aab4bcae"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4d4b0c8031f79606ce6679628e269300ec0c44da830e2e0d99816453989d1225"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"18466fb7826aa543cdef513bf8dfbf6ea10e3faf70116956c8c73eb4a86833d2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"27a2cdd07187c90c312986ffd428a90484d0582cf2cc0ecac5f43a70fc6dfd2b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"adaab9aec2cd03382d623f101a5d81cdb94333b2b756ebe3bc5b0443c111868d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"57235929e0bfb922f80843b78908164653b6146fc7e22d80dca9c12acf58a5f2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e248caad1f3f6bd7cce76d6ab799e2449498b7e60057b6db25c858f25e058fce"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cbfa16b9da981884a135436742505d8570687baa2960696528eb6d2b5e148323"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3427a0d6089b8fdcbb31ff5aca205934164f69540595a085b90149bf84cd2f49"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1ad9df12f21a7c86eb87a433989205311b32b28bd3bd75a31275966dcc450dbe"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"64cbf50167ccc31cd46aad40ed6baa88e51d9a21473bd8a5bf644831dc1e4294"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5bc95e1bee5e69bbf543d4e21d36e064cd9c88ed8bfc0cd598491afc12b4c69b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"93af02cfcc42cbfcb1c9a0a0b0548e4f52efe3634718549279a9a61c98488765"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2ef004358d2ade6125d2b5855fa947508f18b51dbefd1675f57263ea02ccd29e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"02ee2300af40ce8c1a666bd937ff7877358c5d2090975740e449df7bede454e4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8301c55b9eae2056f6eef5e2d931be228d2cf891ba681d9cc6623568ab84056e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1e0fc0809f04c5fd4f945787723d579ed7c964dd2048f43e3631828ca0f6725d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9b6b67bd6b81066d7ca16bb42ba83781e2c59b6270a975569b5e2f7636e3e01c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f80003d1adc6364e7d19e853c38145411d78f39578af49f2a0e6427a8ce4e773"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"399fe3904e2b56791a2ccdcd5920293490882ecd69b1782e693d0fa377cd6044"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e1420b630fbc7b3eb446d1fed73326ac6b1cbb9e7e4c6fb395955017dc22397a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c660512a7f5581c0bbde46e6c025500f8c6fcb6eb1ef0aded7581c704563aa1d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3adae5452385adb842df394f5aaf4b2ce88b6335419247c832093f3c1335d232"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1bc85ee5be4bf3e8e96c1827b1badcdfa7fe307898b0506b51faa1d917d5585b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d0155c2b0eb40a4fc46e6658f9cad18b4a4c243394c06d112f8cfd986e8ca908"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4dc143656ad0d82a37e4ebbd48c482f5791be8d23915ca53df6d86a4a6e5e9ec"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5cf57b3a11f199b9e3311a032f9b4d3ada979731619f02ad1e1c971c85318e27"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0350a7b0f444910944fd4aa976cebb7154873349214b9d3c12327fc99fce36cd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"75eb43088cafc884d8777bdaf51d06f108b80326c010b574796f56b3f4fd76bc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7d357d453279d4e890b99788952a29f81e92a5cf7cb1951648d9f0d141231d27"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"76cb3341060a8da39adf4905c6d8d99d230f075adbe535468e95fac78a791961"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5b5a1bbfe302d4f8ca88365b58b93d5d483755eee4d7994f8a71e0357a48c05f"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5be03ab325ce0dd57044d4e411f1428508ecf7870bea56774afff406be2e7ce3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4f92241376401502a76b0521c8325ec5ac4b2679a6c13f66166ec884cf715b80"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6461481a5c5a671bc46dfd6b4e31ca4416b7d95cc843a13be8bab5f04b3789de"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"02fb7177b069c3af38833085fae90e36f111ccfe12d09dfaacef49eaec4e69a9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"75369c09bb288495c1ec96550eb2aa9585bb73f2d0abcdd876376a94900b52cc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6819b36024d45f5f0e1d43e74427f1e72c7d8dae5d09101e0f966a51bf6829ab"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3643ff687baaf09e4fa86f24721b381bb8ec583e4fb1bc9174a893ca376bdfb1"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"858eb7f80b7507dfba0c3f1f3da34922e68eec00c263f8d42558fd15e99292b9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"075e4f2ebead1d858c0623e59e3fa637f37079b71d275a966e23073acc84b803"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4e5029020df57fb6526e5c5c0829575b8ae66519818739da85e06e7441481ea8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ae59d5e9dd2c30e110a21be3f2f3e4339df91ffb4154cfcf5f17bedb858ec684"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"64478662fa5e1544368a8d37a73d78bfc90ea789fe52460bc2794d70b8e273b3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"24bcc8189b69961073a2a81a26475bc0ac4b4627119c2067a001ba82a978dc0a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"8f26cf859b21a29d8199401b33bcf3af3c7310d1527e0674e2e7f9168d28c86d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6e1285fa2bb7928bdeb4b277d6dabd9f6a5d485aff07593ad02794a6d60b336c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"01d337debb09fbc43aa59cc9c2b3d2e33147d7a24dd6f0c16e045f8b6d3ecf77"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"04b15c1d822501a1f3b0513e178960337673a790f4f183f2453907ced2d2833f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"620f44f7d0814af2bb598a515423618ad407110d7f6058f12541a5a3763e870d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"88e4b8e6b0a398c20e9973132af93e6d920680d6829e9e1090cafbb6d5444dff"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2ce85e4fc38126bdf4c6022d73352ac5b5536de4268a144092ac062a1cbe891a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f1dc354b3011f9a0a91db3424b73859be376136cee0e48ee15c61f19cf1f730c"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5820d2832b24c301dfa745945b6d73762e17d6f8190921e1bba42ea7ccd769f9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cbc48b480e6a5c0169ca6ec167828968536daa072fccaa3ca80ead5934b42c93"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"0ab167f723454865f4b5edead7a6c3da5756fc8554539e5ee9d4f3090e6265ee"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"64aee044c1f4dd4bb7a77441c8cfb2ad1960dbe2c5bbb6dcc4a3af1fa08e7b62"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9e5845775bdb3019250f4ab6e69535d27b4faba766185d25103215328b3b3c8b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ca59b1c44ad333a165108247079dea6bb73502468cf32f3f63c02b0acbce4e6d"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"957b150e90b8de065e3fab913d6db8aa84cc38085b4826b482eaabde0c4cf347"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"865c1256b0af6cac7fabd52ec1703a6840a81e82c2cc09619e5e78e47af02756"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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":"717793d75e5737d1801d03e4fe2d82fc86201925ae17dd5d18e5efeaac180e3f"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1329","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-8","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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":"1e762c844db198f68c29d6a57c87c3101fdca32d8b135e9d2b29d98913e585b7"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1329","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},{"id":"CICD-SEC-8","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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":"220ae72a31df87d2c6a21485f6d342b176aabd2a96e13ba083ad16399b24f919"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-552","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A06:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"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":"81e6f1989a5c265c547a6b3a7a83a9625ade6edc0e432d33dac0fc013036d88e"},"properties":{"dependency":{"package":"proxy-addr","version":"2.0.7","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"a3a0ea1a9d101b97f8b3c099cb232dddf737c0ea7a7b3bb306f917ed61e48a17"},"properties":{"dependency":{"package":"webpack","version":"5.24.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"12ac4d026882a5ce250334bfbaccfe58c62bfcc8f5c618c8389f9fa39171e5e5"},"properties":{"dependency":{"package":"websocket-driver","version":"0.7.4","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"ce9d740b36bf951eb10348b577ec3cb50c568f736fa7f74e6b81507130a9f108"},"properties":{"dependency":{"package":"ansi-html","version":"0.0.7","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"62aeb76b54ce1e0d4fd768032f64ea675ed9d804d9961d04b2b84f761bad175f"},"properties":{"dependency":{"package":"brace-expansion","version":"1.1.11","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"ef0dee3918a9c136018d27040534e18f916334655b219bab9794730ff0d0055d"},"properties":{"dependency":{"package":"braces","version":"2.3.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"423ca7ca8baf1d6544e64b5c28e5f7eef3c8b77efae57a6f819434f5e185e1ad"},"properties":{"dependency":{"package":"browserslist","version":"4.24.4","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"6134a3acbaca9dd34147a80e38d5cc65854102d2f94a83e1e7e7273c4d116c6a"},"properties":{"dependency":{"package":"compression","version":"1.7.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"7f0d82b970bcfae98243321d1a6b21c972f80d7f79fef64593cd124ba2768ee6"},"properties":{"dependency":{"package":"fast-uri","version":"3.0.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"a3ab7b5958021c85b56d4c9a8247639ee6c13b049ecd4b09fdc19d718682491a"},"properties":{"dependency":{"package":"http-proxy-middleware","version":"0.19.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"395496212fa5ae0974489505c70bbd7f5ad4a3591619edde86633cdf7d033fd5"},"properties":{"dependency":{"package":"ip","version":"1.1.9","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"f1024a937dcf05b2055931a08414115f1cfb2eff76ec91d4e684b63fcbb045ff"},"properties":{"dependency":{"package":"lodash","version":"4.17.21","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"091334c907190dd26bab258bbf1f78921690c8f5b57f7ccad89728b88c11f02b"},"properties":{"dependency":{"package":"minimatch","version":"3.1.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"8e95d7f051e688588792b0dad214b27ff53c0fb7637a30d9c9effff683842ffd"},"properties":{"dependency":{"package":"node-forge","version":"0.10.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"c468b0339911f879e14ec320fc535b12991e1b968e42350b1d6cbb09664f8a07"},"properties":{"dependency":{"package":"path-to-regexp","version":"0.1.12","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"2f3302bb3863af04daf85329fb2f2d4d9dee531f2c4e33590337ddb5b6ed2858"},"properties":{"dependency":{"package":"serialize-javascript","version":"6.0.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"7e8e38245d69ab7c7ffe6d4e5eff41a9c5ae935f6ec5330e5ef338cb9ba301b7"},"properties":{"dependency":{"package":"webpack-dev-middleware","version":"3.7.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"3386a791fe3d4a0983186f175f9800e62c2ccfd68d552e84ce2e9014cf1647ec"},"properties":{"dependency":{"package":"ws","version":"6.2.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"b045ae78360c953659c86c06f5bc9abfc6c599786a1acfeb6d3bda754a29b323"},"properties":{"dependency":{"package":"body-parser","version":"1.20.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"3c2d417d2f569b23288ad1ef3684ed93c1b1f4f07757f217e3ae413277f3f83b"},"properties":{"dependency":{"package":"browserslist","version":"4.22.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"7d465d4ecddc9abf0640e51b801008e7a9fa6317798ff9a76f8a3f4e8996c4c2"},"properties":{"dependency":{"package":"compression","version":"1.7.4","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"5a708c7c037ec93253ac856f62c981961384f11d4a5a84b00282873682c7520a"},"properties":{"dependency":{"package":"cross-spawn","version":"7.0.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"1814ad3899c683f97e4434e6eb08a616c064ea142b43d6ecfba6c85e92657335"},"properties":{"dependency":{"package":"cross-spawn","version":"6.0.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"e930faa7d4885d508dade6c97bb7115af4352672bbb2951b3b1739b0e0175cf0"},"properties":{"dependency":{"package":"ip","version":"1.1.8","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"5f7f7342dc2e9d6bef18a998ccaa3c2e7926c3e4b9b3d69c17c342362aa2b9e0"},"properties":{"dependency":{"package":"path-to-regexp","version":"0.1.7","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"5c0b5fc35b192a258aebf7499019bd9a56c9194a65b68f2a55f8c42a39029b0c"},"properties":{"dependency":{"package":"ws","version":"6.2.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[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":"a9da04b0b4412e3fa8ff23a42eefbaebdf7cc9ba306d30720633636bbe4ec378"},"properties":{"dependency":{"package":"ajv","version":"6.12.6","advisory":"[GHSA redacted]","aliases":["[CVE 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":"b912b5cb6b8024900a77ab8ba198c3f9e7f8387aeeda015e73cec2cd0639c00a"},"properties":{"dependency":{"package":"ajv","version":"8.17.1","advisory":"[GHSA redacted]","aliases":["[CVE 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":"6ad1f789abf27ac6049b19ef537a879585649a4cd37fa2c218c482d0e3ae4c45"},"properties":{"dependency":{"package":"decode-uri-component","version":"0.2.2","advisory":"[GHSA redacted]","aliases":["[CVE 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":"b199a54626b3c20c61a2d2c37cc3d24c855793f9c4919834e08d91cea53db0dd"},"properties":{"dependency":{"package":"follow-redirects","version":"1.15.9","advisory":"[GHSA redacted]","aliases":["[CVE 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":"e1d0112be90c2fcdfb2da9719eb59eb78f4fe70cc9ade771d7df0c2c65acf367"},"properties":{"dependency":{"package":"micromatch","version":"3.1.10","advisory":"[GHSA redacted]","aliases":["[CVE 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":"015ce23afeb08a80148d26554140acaed7fb6bc4472fb00f438d093fb8cc1f0d"},"properties":{"dependency":{"package":"qs","version":"6.13.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA 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":"6774a4c06082e2e435d29dc9463adc9fd01d69789bfa09aeba0d9e2bdb0b1a5f"},"properties":{"dependency":{"package":"uuid","version":"8.3.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE 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":"aeb9ee5cc1c13852a86bca9d4639cb6b1b6acb563cc00b800cc0b4d0736c0b4b"},"properties":{"dependency":{"package":"webpack-dev-server","version":"3.11.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA 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":"ffc63d57dccc92319eb4d01de9600afd7e1273baa42a81b856859153e1f51beb"},"properties":{"dependency":{"package":"uuid","version":"3.4.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE 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":"5df709cf95c71ed454d30aa6461f58b6579df8527d7f062d08eeeb8b07bb6610"},"properties":{"dependency":{"package":"express","version":"4.18.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[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":"add540d1f13a314e27ade637d7df65b9e5ff90175b84f62b4b7c7ccf0e001d9f"},"properties":{"dependency":{"package":"follow-redirects","version":"1.15.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[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":"e09d44fdc49fd0f2365a4190e8f0b9f5c54f5f0282949647c09d37679cb378d9"},"properties":{"dependency":{"package":"qs","version":"6.11.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA 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":"0aa7d2a3ecbd67fe7e3b5da85af34d9848303b2fe53d4e6cc8c40f6c8513a9a5"},"properties":{"dependency":{"package":"qs","version":"6.11.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"cf715c47e7319202a5148f9f3594cd539269df37af5c751273bf68a9960e2aa9"},"properties":{"dependency":{"package":"body-parser","version":"1.20.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"c7b4bb12affa15bc2d43989a4b01ed4e9f9819fc7fe96e949fbb553164a72eb5"},"properties":{"dependency":{"package":"on-headers","version":"1.0.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"63818e928f29a36c5bbdc1d4873c34c528206a2ac0acfbb79eeb770dcfdc9a16"},"properties":{"dependency":{"package":"cookie","version":"0.5.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"474822442d438c278264b9119df8e38f2e9fbb0ff586775303e2cda6bb37a817"},"properties":{"dependency":{"package":"send","version":"0.18.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"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":"1fdeff570b9e3686d080dc93220c7a6de0022d79088039967a834a6911c5d4ab"},"properties":{"dependency":{"package":"serve-static","version":"1.15.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: IOPlatformIO.scala \u2194 Fs2PlatformIO.scala: \u0060cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala\u0060 and \u0060cliJS/src/main/scala/dev/bosatsu/Fs2PlatformIO.scala\u0060 change together 100% of the time (16 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 16 shared commits counted here, the most recent 3 are \u0060e1553681\u0060 Vendor C deps for runtime install and CI (#2300); \u0060f39ccdd3\u0060 Support git worktrees when finding repo root (#2238); \u006090aef254\u0060 Use IO.blocking for typechecking (#2008) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"cli/src/main/scala/dev/bosatsu/IOPlatformIO.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ad846d8fc66dccfe2f92c3c3a7aad398681d133c6948a057a8c9f928c89b55f"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: TestBench.scala \u2194 MainModule.scala: \u0060bench/src/main/scala/dev/bosatsu/TestBench.scala\u0060 and \u0060core/src/main/scala/dev/bosatsu/MainModule.scala\u0060 change together 50% of the time (10 of the 20 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u0060d2504565\u0060 Use scala3 context functions in Par withEC (#1466) (at that commit the files were still \u0060bench/src/main/scala/org/bykn/bosatsu/TestBench.scala\u0060 and \u0060core/src/main/scala/org/bykn/bosatsu/MainModule.scala\u0060); \u00607b65eb95\u0060 remove use of ExecutionContext.global (#887) (at that commit the files were still \u0060bench/src/main/scala/org/bykn/bosatsu/TestBench.scala\u0060 and \u0060core/src/main/scala/org/bykn/bosatsu/MainModule.scala\u0060); \u006053d65a19\u0060 Remove cyclic dependencies, re-enable acyclic (#834) (at that commit the files were still \u0060bench/src/main/scala/org/bykn/bosatsu/TestBench.scala\u0060 and \u0060core/src/main/scala/org/bykn/bosatsu/MainModule.scala\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"bench/src/main/scala/dev/bosatsu/TestBench.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b9f5444865b4b516274c0b9178ff2dfadbc023ce64a9280dba1a4a71bdf165d"}},{"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":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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"},"taxa":[{"id":"CICD-SEC-8","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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":"81d0799af757bba1afbed34637d383ea39ed22bd8ff8ec5b09c5aa413595d701"},"taxa":[{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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":"1638f4eaedb32fcd4731c2100797e24cec09f59003ee51d3994d4f7b8c666dbe"},"taxa":[{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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":"c6eb5a94052c328a9f9d4f3228923a5f2d4d56700f96d3ddbb1b358415402983"},"taxa":[{"id":"CICD-SEC-5","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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"},"taxa":[{"id":"CICD-SEC-3","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: PlatformIO[F, Path] (38 abstract members): \u0060PlatformIO[F, Path]\u0060 declares 38 abstract members: \u0060moduleIOMonad\u0060, \u0060parallelF\u0060, \u0060canPromiseF\u0060, \u0060pathArg\u0060, \u0060pathOrdering\u0060, \u0060withEC\u0060, \u0060pathToString\u0060, \u0060readUtf8\u0060, \u0060readBytes\u0060, \u0060readPackages\u0060, \u0060readInterfaces\u0060, \u0060readLibrary\u0060, \u0060fetchHash\u0060, \u0060fsDataType\u0060, \u0060resolve\u0060, \u0060resolve\u0060, \u0060relativize\u0060, \u0060parent\u0060, \u0060unfoldDir\u0060, \u0060hasExtension\u0060, \u0060writeDoc\u0060, \u0060writeStdout\u0060, \u0060writeError\u0060, \u0060readStdinBytes\u0060, \u0060writeStdoutBytes\u0060, \u0060system\u0060, \u0060systemStdout\u0060, \u0060env\u0060, \u0060hostOs\u0060, \u0060hostArch\u0060, \u0060gitShaHead\u0060, \u0060println\u0060, \u0060errorln\u0060, \u0060writeInterfaces\u0060, \u0060writeBytes\u0060, \u0060writeLibrary\u0060, \u0060writePackages\u0060, \u0060withTempPrefix\u0060. Counted over its ABSTRACT members \u2014 a \u0060def\u0060 with no body or a \u0060val\u0060/\u0060var\u0060 with no initializer, once per signature; concrete members, private and protected members, and members of a companion \u0060object\u0060 are not counted, because no implementer is forced to write them. Those 38 declarations carry 37 distinct name(s), so part of the width is overloading rather than separate responsibilities \u2014 but 37 operations clears the \u003E15 bar on its own, so the row is about responsibilities, not signatures. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/PlatformIO.scala"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"09987787a316f2a53b45adf2012a24cdf2e6da9ef14a7a5969c25ecac000e5f8"}},{"ruleId":"AX6","level":"note","message":{"text":"Fat interface: Env (23 abstract members): \u0060Env\u0060 declares 23 abstract members: \u0060monadImpl\u0060, \u0060run\u0060, \u0060appendStatement\u0060, \u0060error\u0060, \u0060globalIdent\u0060, \u0060bind\u0060, \u0060getBinding\u0060, \u0060bindAnon\u0060, \u0060getAnon\u0060, \u0060recursiveName\u0060, \u0060newLocalName\u0060, \u0060newTopName\u0060, \u0060directFn\u0060, \u0060directFn\u0060, \u0060inTop\u0060, \u0060inFnStatement\u0060, \u0060currentTop\u0060, \u0060staticValueName\u0060, \u0060constructorFn\u0060, \u0060staticStringLiteral\u0060, \u0060cachedIdent\u0060, \u0060renderMain\u0060, \u0060renderTests\u0060. Counted over its ABSTRACT members \u2014 a \u0060def\u0060 with no body or a \u0060val\u0060/\u0060var\u0060 with no initializer, once per signature; concrete members, private and protected members, and members of a companion \u0060object\u0060 are not counted, because no implementer is forced to write them. Those 23 declarations carry 22 distinct name(s), so part of the width is overloading rather than separate responsibilities \u2014 but 22 operations clears the \u003E15 bar on its own, so the row is about responsibilities, not signatures. A wide interface forces every implementer and caller to depend on methods they don\u0027t use (the Interface-Segregation \u0027I\u0027 in SOLID). Split it into focused role-interfaces."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/codegen/clang/ClangGen.scala"},"region":{"startLine":223}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bd659756254aed9a5ff4feaa099c72285574205a7dbdd39c00619fc2653f7d2"}},{"ruleId":"IC1","level":"note","message":{"text":"Disabled test: A test is skipped/ignored \u2014 coverage that looks present but never runs. Re-enable it or delete it so the green run means something."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/RingOptLaws.scala"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"4364b410ba8e046c7ba7a6883cfa6fa4fcd684e40cb61197485e590675dd0460"}},{"ruleId":"IC1","level":"note","message":{"text":"Disabled test: A test is skipped/ignored \u2014 coverage that looks present but never runs. Re-enable it or delete it so the green run means something."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/test/scala/dev/bosatsu/RingOptLaws.scala"},"region":{"startLine":1436}}}],"partialFingerprints":{"codehealthFindingId/v1":"b04a7477d23f5adfc4c0f0e1daa75bd76f2981b3a08c7254ce4f56677be5d75e"}},{"ruleId":"M1","level":"warning","message":{"text":"README may be stale: 43 code files changed in the last 6 months but the README was not touched \u2014 it may no longer reflect the system."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e973e7a8d5d866995cbf78b120250fe7f132bf928812d48ca62e69aba11b9910"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: README claims Bosatsu has an in-repo Tree-sitter grammar at syntax/tree-sitter-bosatsu, which exists and is documented; the README example uses a Python/In-browser compiler but there is no Rust or Dhall package referenced \u2014 searched for: \u0060Rust\u0060, \u0060Dhall\u0060. Each was matched case- and separator-insensitively against file and directory NAMES anywhere in the tree, and against the CONTENTS of manifest and configuration files (package.json and other *.json, *.csproj, *.props, *.sln/*.slnx, *.yml, *.toml, *.config, tool configs such as eslint.config.js, Dockerfile); the README\u0027s own prose never counts, so a claim is never refuted by merely being made. Nothing outside that search was read \u2014 a footprint living only in a submodule, in a file type not listed here, or under a name none of those terms matches is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"343bbbd51ceb8de7a9ff88d79f7c797abf9b5921f8727b67b4d0f4f8a22c5e49"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1796-design-a-bytes-type.md names \u0060Bosatsu/IO/Core\u0060, but no file or folder \u0060Bosatsu/IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1796-design-a-bytes-type.md"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"34cf38b56f42efb581409f2b49b1115163cb08128376b87fe00e0129c20fbf3b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1796-design-a-bytes-type.md names \u0060Bosatsu/Collection/Array\u0060, but no file or folder \u0060Bosatsu/Collection/Array\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1796-design-a-bytes-type.md"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddd2acd4606952def6e740a395d03f513c42c4a7be05b5bebabe1cd55146e6ce"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1796-design-a-bytes-type.md names \u0060Bosatsu/IO/Bytes\u0060, but no file or folder \u0060Bosatsu/IO/Bytes\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1796-design-a-bytes-type.md"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bbbbd65685188a9b180de17aa5cebc73baf5f619cc8b1503597296f93dbc0c4"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1796-design-a-bytes-type.md names \u0060IO/Core\u0060, but no file or folder \u0060IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1796-design-a-bytes-type.md"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"e96c7e8bb8a63d5aa997200e68009f345e24c067d6788f1c6e003f7f8bd9b481"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1796-design-a-bytes-type.md names \u0060IO/Bytes\u0060, but no file or folder \u0060IO/Bytes\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1796-design-a-bytes-type.md"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b25c0df4c12cecc2f1cfc6c1649957880c7abfc978160e4d8ee0da56b7713a2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1837-bosatsu-node-add-bosatsu-io-core-eval-run-externals-node-ci-tests.md names \u0060Bosatsu/IO/Core\u0060, but no file or folder \u0060Bosatsu/IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1837-bosatsu-node-add-bosatsu-io-core-eval-run-externals-node-ci-tests.md"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"b223747f5aeb90b5d34b5acacec765b5fb336b86fbbaf0f738fc9afb264327ec"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1859-web-ui-doesn-t-work-due-to-lib-tool-cli-refactor.md names \u0060jsui/Store.cmdHandler\u0060, but no file or folder \u0060jsui/Store.cmdHandler\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1859-web-ui-doesn-t-work-due-to-lib-tool-cli-refactor.md"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"044ec1fab1a36d2b34fe54770a8f999f22e1489711338a9ede5057f93efeee91"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1925-lazy-type.md names \u0060Bosatsu/Lazy\u0060, but no file or folder \u0060Bosatsu/Lazy\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1925-lazy-type.md"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"e476998ab2327fcfc055b8583e39677d27e18499597a9d06a0d9a8008a12cd53"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1949-design-for-testing-prog-values.md names \u0060Bosatsu/Prog\u0060, but no file or folder \u0060Bosatsu/Prog\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1949-design-for-testing-prog-values.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"c76198b9811cb72472403735eb69a1195d721dd7a3206aa448d006de060001b8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1949-design-for-testing-prog-values.md names \u0060c_runtime/bosatsu_ext_Bosatsu_l_Prog.c/.h\u0060, but no file or folder \u0060c_runtime/bosatsu_ext_Bosatsu_l_Prog.c/.h\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1949-design-for-testing-prog-values.md"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b2b2b7ebffe49e6ee65ae91982277895a84463e7a209364765064ed0bc8d92d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/1949-design-for-testing-prog-values.md names \u0060c_runtime/bosatsu_runtime.c/.h\u0060, but no file or folder \u0060c_runtime/bosatsu_runtime.c/.h\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/1949-design-for-testing-prog-values.md"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"6dc683fb0fcfe7c17fca3dffd4d606ddbc645d2d4947a567764e6c3def2d8915"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2084-design-a-benchmarking-blackhole-function.md names \u0060Bosatsu/Prog\u0060, but no file or folder \u0060Bosatsu/Prog\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2084-design-a-benchmarking-blackhole-function.md"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"904780c3c8e4a6769b33150dfdfb6b06b620e4cceb691409e9befc98c234f792"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2084-design-a-benchmarking-blackhole-function.md names \u0060Bosatsu/Predef\u0060, but no file or folder \u0060Bosatsu/Predef\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2084-design-a-benchmarking-blackhole-function.md"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"6192949e292d993d8c71ba978dd22c14c1b30c51c481576e137134163324231a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2084-design-a-benchmarking-blackhole-function.md names \u0060c_runtime/bosatsu_ext_Bosatsu_l_Prog.h/.c\u0060, but no file or folder \u0060c_runtime/bosatsu_ext_Bosatsu_l_Prog.h/.c\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2084-design-a-benchmarking-blackhole-function.md"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8b69304a3f0a904c55fbd03e78de6a142567fabd75ca5bda0b225879e425118"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2087-optimization-rules-may-prevent-lazy-from-being-lazy.md names \u0060Bosatsu/Lazy.lazy\u0060, but no file or folder \u0060Bosatsu/Lazy.lazy\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2087-optimization-rules-may-prevent-lazy-from-being-lazy.md"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"f109e82034ad146b85718c3cdf137b8a3bb5aa6347c620e1b86f7fc2e3861954"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2087-optimization-rules-may-prevent-lazy-from-being-lazy.md names \u0060Bosatsu/Lazy\u0060, but no file or folder \u0060Bosatsu/Lazy\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2087-optimization-rules-may-prevent-lazy-from-being-lazy.md"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"5332012517525fbb3eae935d8a5b667800a81f11c68049f1e30b436cfe66185d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2103-allow-recursion-on-thunk-and-lazy-evaluated-data.md names \u0060Bosatsu/Lazy.get_Lazy\u0060, but no file or folder \u0060Bosatsu/Lazy.get_Lazy\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2103-allow-recursion-on-thunk-and-lazy-evaluated-data.md"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"d76b7d3061a2ea791ab32e4adc81aa741f441f646ce996c856ca9bb84eb083ce"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2103-allow-recursion-on-thunk-and-lazy-evaluated-data.md names \u0060Bosatsu/Lazy\u0060, but no file or folder \u0060Bosatsu/Lazy\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2103-allow-recursion-on-thunk-and-lazy-evaluated-data.md"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"1534d7a7a663d80a6cb77c62b29474ea3c7a6b97e6f5e568cbe042c170246063"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2118-lib-eval-run-should-allow-passing-args-to-the-program.md links to \u0060arg\u0060, but \u0060docs/design/arg\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2118-lib-eval-run-should-allow-passing-args-to-the-program.md"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"c45f53c90ac97df3f2bdc3a9b13c7d9bb96a4f635904c4899d04093729987866"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2182-add-prog-var.md names \u0060Bosatsu/Prog\u0060, but no file or folder \u0060Bosatsu/Prog\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2182-add-prog-var.md"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d77065f1cc5afec5f3fc656073f9de80658059d0bf42a0ee64a8c6763e73f8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2182-add-prog-var.md names \u0060Bosatsu/Lazy.get_Lazy\u0060, but no file or folder \u0060Bosatsu/Lazy.get_Lazy\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2182-add-prog-var.md"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d99f97e0739a9f17e3736f3b5958c7e00d6a1e7eceb7414b0ff61c461344762"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2182-add-prog-var.md names \u0060Bosatsu/Eval.eval\u0060, but no file or folder \u0060Bosatsu/Eval.eval\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2182-add-prog-var.md"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b95389e7d76d9d7eaf9c79a1b99a76de67752d8547f618759218e890558a884"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2182-add-prog-var.md links to \u0060initial\u0060, but \u0060docs/design/initial\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2182-add-prog-var.md"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"d468134aed8764969f1bd27280cb044b8f9a0e2df02933e7fcadbdfda8c66bd4"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2185-design-a-matchless-global-inlining-phase.md names \u0060Bosatsu/Predef.and\u0060, but no file or folder \u0060Bosatsu/Predef.and\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2185-design-a-matchless-global-inlining-phase.md"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4cf3dd99b9d83a153d4f81c24a8b0e7d98cbde11f5b2da096f41457afc65848"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2185-design-a-matchless-global-inlining-phase.md names \u0060Bosatsu/Predef.or\u0060, but no file or folder \u0060Bosatsu/Predef.or\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2185-design-a-matchless-global-inlining-phase.md"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"86530ab2be4e76a121b4d63c7fdcee01a02b07ab16b0d6fa12588d49d11464a3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Lazy\u0060, but no file or folder \u0060Bosatsu/Lazy\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"863e91e2e0a365fc83818ba8b4bf9d2115d70b5364cbbd7b8652e6b1f46fb3f8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Eval\u0060, but no file or folder \u0060Bosatsu/Eval\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"9556c636db9dd74a7b1d7ddd87939d1bd54871a559a4cd6b6e1e55e77d23d400"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Prog\u0060, but no file or folder \u0060Bosatsu/Prog\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb699242fd460e6e3b3cc14765219e8706d6eba5fdc534cbbc3c368dcc86327b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Json\u0060, but no file or folder \u0060Bosatsu/Json\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d60f7149ebd6f1014571be24b1bdf6321a1f012673498d50e083df571d03c93"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/IO/Std\u0060, but no file or folder \u0060Bosatsu/IO/Std\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"22f0d6309981f31eef93a932fb117aef317278486274139f3723f08dd9040be3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060IO/Core\u0060, but no file or folder \u0060IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8225da7eadb5b5f4212308839f0199278db56564dee248674c25fabaf3df7f59"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Collection/Array\u0060, but no file or folder \u0060Bosatsu/Collection/Array\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cf647c8e00ebcbcc5ba1ca0c2ce73e42d3ef0443a991031b191f5494d38798b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/IO/Bytes\u0060, but no file or folder \u0060Bosatsu/IO/Bytes\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b39b7564875374cc6b3d6d46e73ad418c059db12ef4bcf69b83e2f303478fd9"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/IO/Core\u0060, but no file or folder \u0060Bosatsu/IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a07a71b407a3b48cdb92aa7cdade4cfa50f70a5025ebf00b351e27c0a3d72da"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Num/Float64\u0060, but no file or folder \u0060Bosatsu/Num/Float64\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c01891080babc2c2abd17a649572e4d86db40d4a71f9bb4a02597b80a3fe602a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Char\u0060, but no file or folder \u0060Bosatsu/Char\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbedaf4e89b1dca9d61c3f810ff4435dfff90e564314342260958f99ae1c67b1"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/IO/Error\u0060, but no file or folder \u0060Bosatsu/IO/Error\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"d412718aa2e0d3f2e04155cbaf247bfb4a421663ec4087f534ffca8e05c1af00"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/List\u0060, but no file or folder \u0060Bosatsu/List\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7b07b189e11866fb4aef4a145e39bab65d52d2fc556ad9ce52ba1030854d889"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Option\u0060, but no file or folder \u0060Bosatsu/Option\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ec992584c57ae188d97c8cb1f9d7dbc89f29ce89eb53b5031f36d2511781f44"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Bool\u0060, but no file or folder \u0060Bosatsu/Bool\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff20408c156b95bda6c0de9995f8e7a1b4d4d5d5e7cd6b20c20f0fa003896d3e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Rand\u0060, but no file or folder \u0060Bosatsu/Rand\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9637fade3a8376b9b26da81457530f75a39553eaa88dc0649aa369d2a1ca4e8"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Testing/Properties\u0060, but no file or folder \u0060Bosatsu/Testing/Properties\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"57a9fa26ab93b024cd6003368127425e49b67a4c47dbfe0196347cd18fe515a5"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Num/Nat\u0060, but no file or folder \u0060Bosatsu/Num/Nat\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"309c2ff1068399a757f29833ad6cdc3e82a46d3e58fdbbb53bd606f6e8d22319"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Num/BinNat\u0060, but no file or folder \u0060Bosatsu/Num/BinNat\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae86258defbf52a04761382f9badd6ecd8027dc094f4eb30d2ea02b59b96a146"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Num/Binary\u0060, but no file or folder \u0060Bosatsu/Num/Binary\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"614226aca04fb611a72c6814ee4145bb71e0fb3ee4bbd61ecaded04d457bd37b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Dict\u0060, but no file or folder \u0060Bosatsu/Dict\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"c249d55efd4a2ad06ee6dc27c5dffd4dc9c65a9ae7b6ba31280f0003e516b226"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Collection/Queue\u0060, but no file or folder \u0060Bosatsu/Collection/Queue\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6b3955c89492813a225ac15d8ee351aff7dff0b516f2e5fb0981ac05ea561f"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Collection/TreeList\u0060, but no file or folder \u0060Bosatsu/Collection/TreeList\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d6693769fd9098c6a6d23597d520ccf551948f8ffe13da7e31b1295b426943"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2224-remove-unneeded-packages-from-exports.md names \u0060Bosatsu/Nothing\u0060, but no file or folder \u0060Bosatsu/Nothing\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2224-remove-unneeded-packages-from-exports.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"27d820ea20ddd6c43fd6e69c6bb6f638a8d1a8b6d621b7168e1cc0f8d8365a06"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2254-design-required-exposes-declarations-for-exported-dependency-visibility.md names \u0060Bosatsu/Predef\u0060, but no file or folder \u0060Bosatsu/Predef\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2254-design-required-exposes-declarations-for-exported-dependency-visibility.md"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"0de04371ad45e68ca1e122a4ed248c106ecdf350c3b3e18e989e4c67225aaa28"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2287-improve-mkdir-function.md names \u0060Bosatsu/IO/Core\u0060, but no file or folder \u0060Bosatsu/IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2287-improve-mkdir-function.md"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"416519b8ac6e1d4f8141974e6641cf7cdd635dcc99d29972256ac36a474c678e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2304-add-int64-external-struct.md names \u0060Bosatsu/Num/Int64\u0060, but no file or folder \u0060Bosatsu/Num/Int64\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2304-add-int64-external-struct.md"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"56c3707fdb6f733b36673c6668d2d86715f453020347e66d669db5968165ebcd"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2304-add-int64-external-struct.md names \u0060Bosatsu/Int64\u0060, but no file or folder \u0060Bosatsu/Int64\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2304-add-int64-external-struct.md"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"80f7da5da72f2374b3e4191a9118f6dc00bbaba1cfe8827da5cf2a3125ec8e91"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2304-add-int64-external-struct.md names \u0060Bosatsu/Num/Float64\u0060, but no file or folder \u0060Bosatsu/Num/Float64\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2304-add-int64-external-struct.md"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae4e8c96e8422dd063bbdaca83686843b8d99f277be4db40b99437ad7e3d9b59"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2304-add-int64-external-struct.md names \u0060Bosatsu/Num\u0060, but no file or folder \u0060Bosatsu/Num\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2304-add-int64-external-struct.md"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"2095028c6a5e494592d913cf003bc8d23d7d8bf7d2643502d8abaeedf69945fc"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2304-add-int64-external-struct.md names \u0060Bosatsu/Rand\u0060, but no file or folder \u0060Bosatsu/Rand\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2304-add-int64-external-struct.md"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1b8c237b542486341e4c7484b52cf3236862ce12cbb0bae0e0b176551e67f45"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2307-leverage-int64-in-array.md names \u0060Bosatsu/Collection/Array\u0060, but no file or folder \u0060Bosatsu/Collection/Array\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2307-leverage-int64-in-array.md"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"a651627683758ce9d9260d704a6a7eb8dd216e0fe2f8297ed2ca96e16d19dce0"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2307-leverage-int64-in-array.md names \u0060Bosatsu/Num/Int64\u0060, but no file or folder \u0060Bosatsu/Num/Int64\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2307-leverage-int64-in-array.md"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"6972c814f8130df4ec37d4540bec5c5db7484f4fa1854df25b85e6152a2b09d3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2307-leverage-int64-in-array.md names \u0060Bosatsu/Testing/Properties\u0060, but no file or folder \u0060Bosatsu/Testing/Properties\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2307-leverage-int64-in-array.md"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e04e251d1fb689575a8845137b97c0a24d33cad916fb8bad2ff837bcab06f10"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2365-specify-the-portable-process-stop-and-status-contract.md names \u0060Bosatsu/IO/Core\u0060, but no file or folder \u0060Bosatsu/IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2365-specify-the-portable-process-stop-and-status-contract.md"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"825bfce23243fe77ef7542c96f92e53a11c77cd555200fd62dba6e47b07e6546"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/2371-specify-the-managed-with-process-helper-contract.md names \u0060Bosatsu/IO/Core\u0060, but no file or folder \u0060Bosatsu/IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/2371-specify-the-managed-with-process-helper-contract.md"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ad7c41544c90b59facc89ac56fe044ed5a5901a65c388ad82883774e770d688"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/414-consider-implementing-caching-of-compiled-files.md names \u0060core/src/main/scala/dev/bosatsu/tool/CompileCache.scala\u0060, but no file or folder \u0060core/src/main/scala/dev/bosatsu/tool/CompileCache.scala\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/414-consider-implementing-caching-of-compiled-files.md"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4364f2d26ec77e0aba55395ad582373358d1ce3b3e6d69c87c093905f91a460"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/414-consider-implementing-caching-of-compiled-files.md names \u0060tool/CompileCache.scala\u0060, but no file or folder \u0060tool/CompileCache.scala\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/414-consider-implementing-caching-of-compiled-files.md"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"20a0425e235297ebff7b107c27a005ce4d3a96a01db2a66f0da9fc2196f557da"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/815-protobuf-value-generator.md names \u0060Bosatsu/IO/Core.write_bytes\u0060, but no file or folder \u0060Bosatsu/IO/Core.write_bytes\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/815-protobuf-value-generator.md"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"7104a820dbbb532bb41f38ccc2e7da042a766f6e6f3cc6145db7172d7ba4e534"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/815-protobuf-value-generator.md names \u0060c_runtime/bosatsu_ext_Bosatsu_l_Num_l_Float64.c/.h\u0060, but no file or folder \u0060c_runtime/bosatsu_ext_Bosatsu_l_Num_l_Float64.c/.h\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/815-protobuf-value-generator.md"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"96e6e80e80e35d71e912ca76dd8a24b96eefaf5f03c332dabec22f31e1cd7912"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/815-protobuf-value-generator.md names \u0060Bosatsu/Proto/Wire\u0060, but no file or folder \u0060Bosatsu/Proto/Wire\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/815-protobuf-value-generator.md"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"026ca49b57393423a7d11992217503ca9003f1c5d4ed5a86594d26d98c29f284"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/design/int-runtime-performance-experiments.md names \u0060c_runtime/bench_exe\u0060, but no file or folder \u0060c_runtime/bench_exe\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/design/int-runtime-performance-experiments.md"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1a98d800fc7bee635e1d61916b79c16d6dea2b5326e42b4a01b2cd1dc5da65a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/getting_started.md names \u0060src/MyLib/Hello.bosatsu\u0060, but no file or folder \u0060src/MyLib/Hello.bosatsu\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/getting_started.md"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"c955d7ef96e47984379d4bd439c3b57a1ab74ef7a846643ab44d2713fec0f01d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/language_guide.md links to \u0060getting_started.html\u0060, but \u0060docs/src/main/paradox/getting_started.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/language_guide.md"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"9abf20d3568f529eed103a8d1a83cc5bd741251880dc8995958a7b27a5ef3d36"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/language_guide.md names \u0060Bosatsu/Predef\u0060, but no file or folder \u0060Bosatsu/Predef\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/language_guide.md"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"def000763137ad178d98ac93be9bdda52bc5b3f1a035e8db6c13ad62d278b139"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/language_guide.md links to \u0060recursion.html\u0060, but \u0060docs/src/main/paradox/recursion.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/language_guide.md"},"region":{"startLine":455}}}],"partialFingerprints":{"codehealthFindingId/v1":"e17dc7b66b5fb51a39e6f3bb4a6d94aad97765afa061fc1f936c134a1bbeae1a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/language_guide.md names \u0060Bosatsu/Prog\u0060, but no file or folder \u0060Bosatsu/Prog\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/language_guide.md"},"region":{"startLine":1095}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe6e427c1ec2ec327451d6f4c1e337d966bfbbf8b3cbdd0d8d3a1354a03c174c"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/recursion.md names \u0060Bosatsu/Lazy.get_Lazy\u0060, but no file or folder \u0060Bosatsu/Lazy.get_Lazy\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/recursion.md"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3c09ea1b2b952d15287e0ed96e3d0bd418dd05c591832528b6a38ddf9f1add6"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/recursion.md names \u0060Bosatsu/Predef\u0060, but no file or folder \u0060Bosatsu/Predef\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/recursion.md"},"region":{"startLine":321}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ca17fdab6d2b296e45dcc47b431caf426dd4bdfb84788bd0f691eb8df28fddf"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/transpile_python.md links to \u0060getting_started.html\u0060, but \u0060docs/src/main/paradox/getting_started.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/transpile_python.md"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"088b1fa2cb2d063c2bd805220293c1a3a875ee56aff551384c26519017d359be"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/writing_bosatsu_5_minutes.md links to \u0060getting_started.html\u0060, but \u0060docs/src/main/paradox/getting_started.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/writing_bosatsu_5_minutes.md"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c96941c8e690cb2d73233201ce255e5d6554a7df38672fdf2acbac236f6df68"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/writing_bosatsu_5_minutes.md links to \u0060language_guide.html\u0060, but \u0060docs/src/main/paradox/language_guide.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/writing_bosatsu_5_minutes.md"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"f55c8e84a5b5905e387f69394f1a1df721604f25dae3d9e34669f69a32f4d801"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060compiler_leveraging_type_inhabitedness.html\u0060, but \u0060docs/src/main/paradox/design-docs/compiler_leveraging_type_inhabitedness.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"12350e730a543fe35c035281be6d36463b14bf27fc202cd5e1c3240b1af7df71"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060pattern_guards_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/pattern_guards_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"78d4a002e37f45111062300fe47ecc0234abc59cf1ec69329c11e887f8970e24"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060issue_1628_pattern_value_reuse_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/issue_1628_pattern_value_reuse_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"47ffec3a2016310ad95084869367973a64392c93df69bf4c9f3ab70b86b665b3"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060issue_1676_default_values_struct_enum_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/issue_1676_default_values_struct_enum_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d620228d1f3cc211e0c1997b49f872b32bdb14124cc4dfb23654140a940e590"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060issue_356_struct_update_syntax_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/issue_356_struct_update_syntax_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9209bb0457c4706cb88b5215d53e111a6dcf26d2a66d6864d5344bff03e1492"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060well_typed_statement_generator_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/well_typed_statement_generator_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd4df60f874a548da250643ae276c9404c7c7a7f224173f2a6b10a92f6fdda9"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060quantifier-evidence-design.html\u0060, but \u0060docs/src/main/paradox/design-docs/quantifier-evidence-design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"b91afe4c72a35ad8eb8a80f14a916b048c28e56d0d245984302521d9e0dac4b6"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060issue_1718_instantiate_pushdown_unification_plan.html\u0060, but \u0060docs/src/main/paradox/design-docs/issue_1718_instantiate_pushdown_unification_plan.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c4f9d095e3e7df2da0eb34d45a45e26fa6523c73ed435a2276a88820b04a043"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060issue_1727_multi_parameter_group_recursion_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/issue_1727_multi_parameter_group_recursion_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"decc7031b453894712cee6c9e734c1d1d5e4d7afc9f87e2af23a02e743cef9ae"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060issue_1732_match_site_struct_scrutinee_elision_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/issue_1732_match_site_struct_scrutinee_elision_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bcadda66b99ff9a704ed4e651cf48b9ee44f0f21d1323859cc6222c01f9af25"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060lexicographic_recur_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/lexicographic_recur_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"04ed37c991744439d5722f7fc3fc726f6222f33c8ad37fc54b5cddfd8d7ab68a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060minimal_prog_io_tools_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfd4981d2abc64d6029eb4df8ca8b882b3add45028258120f99dbe69c73bbf8e"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060prog_concurrency_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/prog_concurrency_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"2be81add75fb5785702ecf4ac28446d81fee85246aea89a58aaa05f094605e24"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/index.md links to \u0060recur_int_decrease_design.html\u0060, but \u0060docs/src/main/paradox/design-docs/recur_int_decrease_design.html\u0060 does not exist. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/index.md"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"2938ee3b11d81ccb2a04712f20b6fbb4fd0ed564e7c57d6934b967ebcf1dff94"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/issue_1718_instantiate_pushdown_unification_plan.md names \u0060cli/test\u0060, but no file or folder \u0060cli/test\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/issue_1718_instantiate_pushdown_unification_plan.md"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"0710356e601c778920c9acabda57716b247089ca61412b65a7a42511814785e5"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md names \u0060Bosatsu/IO/Std\u0060, but no file or folder \u0060Bosatsu/IO/Std\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"67381dc2be175e5b8353887b19a0f30975bbc5196e8289256aa66a16edd9f1e4"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md names \u0060Bosatsu/Prog\u0060, but no file or folder \u0060Bosatsu/Prog\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"5efef96d3284cea6e7936db798960e2e6e128a5528b96a887b2d3153ca8aeb91"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md names \u0060Bosatsu/IO/Core\u0060, but no file or folder \u0060Bosatsu/IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab99ea3138e96431056b2c89de962e12e9c4834478257304b565c268e8024d38"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md names \u0060Bosatsu/Predef\u0060, but no file or folder \u0060Bosatsu/Predef\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a85fa9283d45b0eaf34b0a911accd93a3afa44b29a89b90e160313afc6b1b0b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md names \u0060IO/Core\u0060, but no file or folder \u0060IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/minimal_prog_io_tools_design.md"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"15a29b527c88a339b713de9574cd309baf7908ef047f949fe0a6b70a2026f21a"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/pattern_guards_design.md names \u0060core/src/main/scala/dev/bosatsu/DefRecursionCheck.scala\u0060, but no file or folder \u0060core/src/main/scala/dev/bosatsu/DefRecursionCheck.scala\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/pattern_guards_design.md"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd63f4442073dc7bac0e7e3a9676aa6e67089f0cd144a1e8e39b669c74766339"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md names \u0060Bosatsu/Prog\u0060, but no file or folder \u0060Bosatsu/Prog\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"df353ffc5e7a51588618d171d808ddc08218d25e04df0560f810d66a2684dbe4"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md names \u0060Bosatsu/IO/Core\u0060, but no file or folder \u0060Bosatsu/IO/Core\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"6547590451b7e29d99e85570f6f8b6b194c4b52f87fcc8e825cb6192b9b5a53b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md names \u0060Bosatsu/IO/Core.spawn\u0060, but no file or folder \u0060Bosatsu/IO/Core.spawn\u0060 exists. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"74db01050ca0a5980a23eee5741a4cb697a0e72ee8cf1fed166e19990a9246af"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md documents the environment variable \u0060BSTS_EFFECT_IMMEDIATE\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":657}}}],"partialFingerprints":{"codehealthFindingId/v1":"90e74a89b9d1bc7374f7ea34448b32a9e0a128704e3aef67b007164cde528bbf"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md documents the environment variable \u0060BSTS_EFFECT_PENDING\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":658}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d960d4bbb45799e3223b95c2d1863bf2c3f0b9e72858e0154fb167b26685b8d"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md documents the environment variable \u0060UV_ECANCELED\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":703}}}],"partialFingerprints":{"codehealthFindingId/v1":"23253e93f1b031bbd2e48361649f089520fbcb814229c8d96c485663e73d1e1b"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md documents the environment variable \u0060UV_INHERIT_STREAM\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":946}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d496a64c2b00d8515acbed10d4ee59248a68b69ba00e1f5845a3449a25218e2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md documents the environment variable \u0060UV_CREATE_PIPE\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"019f1e049a6713ae9e59fa2866af54285923e3fd96a8473d7e598c5474d66263"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md documents the environment variable \u0060UV_READABLE_PIPE\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":949}}}],"partialFingerprints":{"codehealthFindingId/v1":"e482c312a9f20b91d765975cbfd429897745241a7bbc49ec373f408dcda19986"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: docs/src/main/paradox/design-docs/prog_concurrency_design.md documents the environment variable \u0060UV_WRITABLE_PIPE\u0060, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents\u0027 own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/src/main/paradox/design-docs/prog_concurrency_design.md"},"region":{"startLine":950}}}],"partialFingerprints":{"codehealthFindingId/v1":"9097a30da1077cdfd12f901168b0b3f1eafca414b2f484972007a4bbee69ac6f"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 1/2 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060.\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add scalafix or scapegoat (or \u0060semgrep --config=auto\u0060, which runs on any language) as a CI step. What was searched, so you can tell an absence from a miss: the 38701 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge\u0027s web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen \u2014 if that is your case the row is wrong, and saying so is more useful than adding a second scanner."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"P4","level":"note","message":{"text":"No release approval gate: The release is automated and no gate that pauses it for a human is DECLARED IN THIS REPOSITORY\u0027S PIPELINE FILES. What was read: every file under \u0060.github/workflows/\u0060, \u0060.forgejo/workflows/\u0060, \u0060.gitea/workflows/\u0060, \u0060.azuredevops/\u0060 and \u0060.azure-pipelines/\u0060, plus \u0060.gitlab-ci*\u0060 and \u0060azure-pipelines*\u0060 \u2014 with comment text stripped, so documenting a gate is not declaring one. What would have counted: GitLab\u0027s \u0060when: manual\u0060, CircleCI\u0027s \u0060type: approval\u0060, an Azure \u0060ManualValidation@\u0060 task or an \u0060approvals:\u0060 block, a Jenkins \u0060input\u0060 step, a \u0060uses:\u0060 step naming an approval action, an \u0060environment:\u0060 paired with \u0060reviewers\u0060 / \u0060required_reviewers\u0060 / \u0060protection\u0060 / \u0060wait-timer\u0060 / \u0060deployment_branch_policy\u0060, a draft-release step, a \u0060workflow_dispatch\u0060 promotion, or a release-event gate. \u2605 What this cannot see, because none of it is a file: a GitHub environment whose required reviewers are configured in repo SETTINGS, a branch protection rule, or an organisation deployment policy \u2014 all of them real, enforced gates that live outside the repository. If yours is one of those, this row is wrong and nothing in the tree could have told us. Otherwise: whatever the release trigger points at is published to users unreviewed, so a mistagged or unverified commit ships and the only remedy is a follow-up release."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6c11e2dbd483b4b423b95ac61bfcc7af1d55351b28a20d2b1105b31cfe38cc60"}},{"ruleId":"PF1","level":"note","message":{"text":"Benchmarks don\u0027t track allocations: A JMH/Jetpack Benchmark suite exists but nothing turns on its allocation measurement \u2014 allocations (the main way hot code pressures a garbage collector or allocator) aren\u0027t being measured."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"bench/src/main/scala/dev/bosatsu/TestBench.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2f7f90629136f39c3847c8be2f61dd67f45a3969580dd0bee78d61480f2dbb3"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(!ch.isWhitespace) \u0026\u0026 (ch != \u0027(\u0027) \u0026\u0026 (ch != \u0027)\u0027) \u0026\u0026 (ch != \u0027;\u0027)\u0060 appears character-identically in 2 files \u2014 core/src/main/scala/dev/bosatsu/smt/SExpr.scala, core/src/main/scala/dev/bosatsu/smt/SExprParser.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/smt/SExpr.scala"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"8be28339564019d0c240f965d4897d7b8708700f5d5215ec152047e103f36e25"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(branchOnlyUses \u003E 0) \u0026\u0026 (eagerUses == 0)\u0060 appears character-identically in 2 files \u2014 core/src/main/scala/dev/bosatsu/InlineBenefitModel.scala, core/src/main/scala/dev/bosatsu/Matchless.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/InlineBenefitModel.scala"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"0756f2cfe775d95f2040eb70c73310cb09ff91048543879c144525e6fbe80042"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(s.variant == 0) \u0026\u0026 (s.value == UnitValue)\u0060 appears character-identically in 2 files \u2014 core/src/main/scala/dev/bosatsu/Value.scala, core/src/main/scala/dev/bosatsu/ValueToJson.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Value.scala"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ca6c0cd9bd2fd30a6f2f8daf35746a578b0c9b5749c22e1a58cea244940618a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(totalUses \u003E 0) \u0026\u0026 (nonDirectCalleeUses == 0)\u0060 appears character-identically in 2 files \u2014 core/src/main/scala/dev/bosatsu/InlineBenefitModel.scala, core/src/main/scala/dev/bosatsu/Matchless.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/InlineBenefitModel.scala"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"f84ba4217c50c43485e98d18e03b3f039b27ef4679deca772596480774aa9143"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060archiveStr.endsWith(\u0022.tar.gz\u0022) || archiveStr.endsWith(\u0022.tgz\u0022)\u0060 appears character-identically in 2 files \u2014 core/src/main/scala/dev/bosatsu/cruntime/Command.scala, core/src/main/scala/dev/bosatsu/cruntime/VendoredDeps.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/cruntime/Command.scala"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfd50c0c17d69f6f1cc35ff0d167317b618e3abf544b43db6fa2f091f30ac019"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060bi.signum \u003C 0 || bi.compareTo(BigInteger.valueOf(PosixModeMask.toLong)) \u003E 0\u0060 appears character-identically in 2 files \u2014 core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala, core/src/main/scala/dev/bosatsu/Predef.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"855a1ea390968b58b2018eb475526dbc52bc83edef6bf9cca475a5f4f652d7c6"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060ch == \u0027/\u0027 || ch == \u0027\\\\\u0027 || Character.isISOControl(ch)\u0060 appears character-identically in 2 files \u2014 core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala, core/src/main/scala/dev/bosatsu/Predef.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"37a6ed3763114bce77d80eba10fda7dd021b191d8e6f62319b22924df8d13b3d"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060hasOuterRecur(expr, inNestedLoop) || hasOuterRecur( in, inNestedLoop )\u0060 appears character-identically in 2 files \u2014 core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala, core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"21630c54930c2135a5ee9bed11c73fafd8e588a38be8976bcd21be834d07a742"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060hasOuterRecur(fn, inNestedLoop) || appArgs.exists( hasOuterRecur(_, inNestedLoop) )\u0060 appears character-identically in 2 files \u2014 core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala, core/src/main/scala/dev/bosatsu/TypedExprNormalization.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/TypedExprLoopRecurLowering.scala"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a24762fb7ecb731d634b24bb6aa5ad55c290e73367257c8dc61dc8b02a5f7a1"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060pattern.definitelyTotal \u0026\u0026 guardOpt.isEmpty\u0060 appears character-identically in 2 files \u2014 core/src/main/scala/dev/bosatsu/Expr.scala, core/src/main/scala/dev/bosatsu/TypedExpr.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Expr.scala"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a51a45a93b544a4aea09a6baf463609ab66bcda1648295e4b083db01f63d096"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060s.variant == 0 \u0026\u0026 (s.value == UnitValue)\u0060 appears character-identically in 2 files \u2014 core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala, core/src/main/scala/dev/bosatsu/Predef.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae442a6454770208e50ca40082b5d05827423579f654d74fe59c4af7d642d606"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060s.variant == 1 \u0026\u0026 (s.value == UnitValue)\u0060 appears character-identically in 2 files \u2014 core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala, core/src/main/scala/dev/bosatsu/Predef.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/.js/src/main/scala/dev/bosatsu/PredefIoCorePlatform.scala"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"2659ac225abcbe4eeb52244682a2888e9f7f58792c516e7dd181c72c8b5386ea"}},{"ruleId":"X17","level":"warning","message":{"text":"Recursive walk over a caller-supplied document has no depth cap: \u0060JsApi.jsonToAny\u0060 is public and takes \u0060j: Json\u0060 from its caller, and it calls itself at line 88 with a piece of \u0060j\u0060, not as a tail call the compiler turns into a loop \u2014 and nowhere in \u0060JsApi.jsonToAny\u0060 is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the value it is handed, so the nesting of the caller\u0027s document \u2014 not this code \u2014 decides how deep the stack goes. On the JVM\u0027s default 1 MB thread stack a walk like this one throws \u0060StackOverflowError\u0060 from about 500\u20132,000 levels on a cold first call and 6,000\u201317,000 once warmed up (OpenJDK 21 and 25), while \u0060ujson.read\u0060, Jackson\u0027s \u0060readTree\u0060 before 2.15 and circe before 0.14.16 accept any nesting (2,000,000 levels from 4 MB) and circe 0.14.16 accepts 4,096 \u2014 on a cold JVM even play-json\u0027s cap of 1,000 is past the point the walk fails. \u0060StackOverflowError\u0060 is not \u0060NonFatal\u0060: \u0060Try\u0060, \u0060case NonFatal(e)\u0060 and \u0060recover\u0060 do not stop it, and in a \u0060Future\u0060 on the global execution context it leaves the future forever incomplete. Thread a depth argument through \u0060JsApi.jsonToAny\u0060 and reject the value past a fixed maximum, or rewrite the descent with an explicit stack."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"jsapi/src/main/scala/dev/bosatsu/jsapi/JsApi.scala"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"2867b00a61d181392073152c65724b9b79b2aafbd5250d7087b0e3b8078b6c1c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"core/src/main/scala/dev/bosatsu/Predef.scala"},"region":{"startLine":3233}}}],"partialFingerprints":{"codehealthFindingId/v1":"af7a9bef2e7854fee54c664b9785ebd9be6a400e9d673ad27687d73738c2d24d"}}],"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-1104","guid":"4c918cb5-b2a6-6c55-9963-a44ee464305e","name":"Use of Unmaintained Third Party Components","shortDescription":{"text":"Use of Unmaintained Third Party Components"},"helpUri":"https://cwe.mitre.org/data/definitions/1104.html"},{"id":"CWE-1329","guid":"f70f1c3f-4ccf-cb5e-bdd3-03ba4868d36d","name":"Reliance on Component That is Not Updateable","shortDescription":{"text":"Reliance on Component That is Not Updateable"},"helpUri":"https://cwe.mitre.org/data/definitions/1329.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":"Missing Support for Integrity Check","shortDescription":{"text":"Missing Support for Integrity Check"},"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":"Embedded Malicious Code","shortDescription":{"text":"Embedded Malicious Code"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-522","guid":"71fb233e-ce6a-ae57-9419-ef8373540b09","name":"Insufficiently Protected Credentials","shortDescription":{"text":"Insufficiently Protected Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/522.html"},{"id":"CWE-552","guid":"3492436b-eca2-9c54-9ba3-5dade427c903","name":"Files or Directories Accessible to External Parties","shortDescription":{"text":"Files or Directories Accessible to External Parties"},"helpUri":"https://cwe.mitre.org/data/definitions/552.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)","shortDescription":{"text":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)"},"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":"Inclusion of Functionality from Untrusted Control Sphere","shortDescription":{"text":"Inclusion of Functionality from Untrusted Control Sphere"},"helpUri":"https://cwe.mitre.org/data/definitions/829.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Improper Control of Generation of Code (\u0027Code Injection\u0027)","shortDescription":{"text":"Improper Control of Generation of Code (\u0027Code Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]},{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61","version":"2025","organization":"OWASP Foundation","informationUri":"https://top10.owasp.org/2025/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10:2025 web application security risks."},"taxa":[{"id":"A03:2025","guid":"168e227c-7735-2e57-bc6e-997affe644c5","name":"Software Supply Chain Failures","shortDescription":{"text":"Software Supply Chain Failures"},"helpUri":"https://top10.owasp.org/2025/A03_2025-Software_Supply_Chain_Failures/"},{"id":"A05:2025","guid":"87e86033-3231-8458-8e4a-5cb82743553a","name":"Injection","shortDescription":{"text":"Injection"},"helpUri":"https://top10.owasp.org/2025/A05_2025-Injection/"},{"id":"A06:2025","guid":"491554d7-b8e4-9652-91a9-53700dc92ece","name":"Insecure Design","shortDescription":{"text":"Insecure Design"},"helpUri":"https://top10.owasp.org/2025/A06_2025-Insecure_Design/"},{"id":"A07:2025","guid":"334ddd78-539d-d35c-83dd-253647eb7eaf","name":"Authentication Failures","shortDescription":{"text":"Authentication Failures"},"helpUri":"https://top10.owasp.org/2025/A07_2025-Authentication_Failures/"},{"id":"A08:2025","guid":"84b0c297-710e-9a5f-9335-936ecb260c36","name":"Software or Data Integrity Failures","shortDescription":{"text":"Software or Data Integrity Failures"},"helpUri":"https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/"}]},{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35","organization":"OWASP Foundation","informationUri":"https://owasp.org/www-project-top-10-ci-cd-security-risks/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10 CI/CD Security Risks."},"taxa":[{"id":"CICD-SEC-3","guid":"458c83a6-ebf7-cf55-8cc3-b4d949bbf271","name":"Dependency Chain Abuse","shortDescription":{"text":"Dependency Chain Abuse"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-03-Dependency-Chain-Abuse"},{"id":"CICD-SEC-5","guid":"cc7f4610-8859-e654-9029-d5f97d992220","name":"Insufficient PBAC (Pipeline-Based Access Controls)","shortDescription":{"text":"Insufficient PBAC (Pipeline-Based Access Controls)"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-05-Insufficient-PBAC"},{"id":"CICD-SEC-6","guid":"f2ee2486-b260-2952-a41f-6b67fa713940","name":"Insufficient Credential Hygiene","shortDescription":{"text":"Insufficient Credential Hygiene"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-06-Insufficient-Credential-Hygiene"},{"id":"CICD-SEC-8","guid":"b6b2dacf-a168-4957-876e-a8c73ee00eb0","name":"Ungoverned Usage of 3rd Party Services","shortDescription":{"text":"Ungoverned Usage of 3rd Party Services"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-08-Ungoverned-Usage-of-3rd-Party-Services"},{"id":"CICD-SEC-9","guid":"b3d36727-0395-5b51-94c4-5e173d62eab3","name":"Improper Artifact Integrity Validation","shortDescription":{"text":"Improper Artifact Integrity Validation"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-09-Improper-Artifact-Integrity-Validation"}]}],"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":143,"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."]}]}