{"$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":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"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":"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":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D27","name":"Navigability","shortDescription":{"text":"Navigability"},"helpUri":"https://codehealth.canine.dev/dimensions/D27"},{"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":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"id":"AC2","name":"Forms \u0026 labels","shortDescription":{"text":"Forms \u0026 labels"},"helpUri":"https://codehealth.canine.dev/dimensions/AC2"},{"id":"AC3","name":"Page structure","shortDescription":{"text":"Page structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AC3"},{"id":"AC6","name":"Visual \u0026 motion safety","shortDescription":{"text":"Visual \u0026 motion safety"},"helpUri":"https://codehealth.canine.dev/dimensions/AC6"},{"id":"AC7","name":"A11y enforcement","shortDescription":{"text":"A11y enforcement"},"helpUri":"https://codehealth.canine.dev/dimensions/AC7"},{"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":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"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":"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":"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":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R5","name":"Dependency Freshness","shortDescription":{"text":"Dependency Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/R5"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"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":"X2","name":"Cancellation propagation","shortDescription":{"text":"Cancellation propagation"},"helpUri":"https://codehealth.canine.dev/dimensions/X2"},{"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":"GraphemesKt.classify (cyclomatic 92): GraphemesKt.classify 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/Graphemes.kt"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d112daca160119af8ae536244ab52e5026ddea8db7f14814511a6ec962e7639"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchHelperBase.findSentenceRangeEnd (cyclomatic 63): VimSearchHelperBase.findSentenceRangeEnd has cyclomatic complexity 63 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1249}}}],"partialFingerprints":{"codehealthFindingId/v1":"10063e6f86b7954438e5beb99fc9041ca5bcfebc2ec4f83e525c575a202921fb"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchGroupBase.parseSubstituteCommand (cyclomatic 58): VimSearchGroupBase.parseSubstituteCommand has cyclomatic complexity 58 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1186}}}],"partialFingerprints":{"codehealthFindingId/v1":"df0e1aa210528690cd70101cc5b7347aeec24617b1d118b50ff05288a37f9c2a"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchHelperBase.findSentenceEnd (cyclomatic 43): VimSearchHelperBase.findSentenceEnd has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1117}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa58db9ad6edf6b6637feeee873acf99f3a6683efb2d9ac73a454c677cad1f72"}},{"ruleId":"D1","level":"warning","message":{"text":"VimStringParserBase.parseVimScriptString (cyclomatic 43): VimStringParserBase.parseVimScriptString has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: VimStringParserBase.getVimKeyName (cyclomatic 63) 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParserBase.kt"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a0e4afc83e07c76a4428618270f47b2118e8155c1f93b97c569af0c2c598a12"}},{"ruleId":"D1","level":"warning","message":{"text":"DigraphSequence.processKey (cyclomatic 43): DigraphSequence.processKey has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f61dc37549576253fd7661c5b9cfbd1e95e7512a4b7c4afc12927ffb9eec19e"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchHelperBase.findWordObject (cyclomatic 40): VimSearchHelperBase.findWordObject 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1663}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5bce64341c42a634c784bf8d175bf41ca879e59c258aa19c107951eb4c541d6"}},{"ruleId":"D1","level":"warning","message":{"text":"UtilKt.getModeBackground (cyclomatic 40): UtilKt.getModeBackground has cyclomatic complexity 40 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"92962cd3e367e36834260b5d758ea58d3eed7d3762e37a5d1df678f0a3fa0867"}},{"ruleId":"D1","level":"warning","message":{"text":"IndentObjectHandler.getRange (cyclomatic 38): IndentObjectHandler.getRange has cyclomatic complexity 38 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/textobjindent/VimIndentObject.kt"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"761f41d4e63e1f2a6cd94f0e1840cb4ce68f65dc62e9af572599698a3be36037"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchGroupBase.findItOffset (cyclomatic 35): VimSearchGroupBase.findItOffset has cyclomatic complexity 35 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1477}}}],"partialFingerprints":{"codehealthFindingId/v1":"a53a09607efbaf40f6b743628b455c40f11efbdd93318d45aefaacf5702ae0ec"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchHelperBase.findSentenceStart (cyclomatic 34): VimSearchHelperBase.findSentenceStart 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1034}}}],"partialFingerprints":{"codehealthFindingId/v1":"780589d4959039b9a26a722fafbb3b496ed7b46b87c42e770c7afcf63f1f6eac"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphemesKt.nextBoundary (cyclomatic 30): GraphemesKt.nextBoundary has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/Graphemes.kt"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"00326386f964ef839cb592ba9d7e56f2063ab9c18c917f0e9db7b3c3424e48ab"}},{"ruleId":"D1","level":"warning","message":{"text":"VimRegex.buildSubstituteString (cyclomatic 30): VimRegex.buildSubstituteString 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/VimRegex.kt"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1fd1c99b3f2fed6c9c8560255c5a8adfed67a76d4dc8a759010563b63d001ea"}},{"ruleId":"D1","level":"warning","message":{"text":"SetCommandKt.parseOptionLine (cyclomatic 30): SetCommandKt.parseOptionLine has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e76fa6ccad4a980fa64d139440f26e5b1881e9cc1ec9a25d2f3f2135008c0a6"}},{"ruleId":"D1","level":"warning","message":{"text":"OutputPanel.handleHitEnterPrompt (cyclomatic 30): OutputPanel.handleHitEnterPrompt 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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt"},"region":{"startLine":702}}}],"partialFingerprints":{"codehealthFindingId/v1":"80f7e82f3c82119b97b10a3f6b928d7b19f16f3d84bd628cf08e5816abc47ba4"}},{"ruleId":"D1","level":"warning","message":{"text":"VimChangeGroupBase.findNumberInText (cyclomatic 28): VimChangeGroupBase.findNumberInText 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":2163}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc007be6d7a18d54058d4f74834829f4ff000c85136f25d1b606beee4292eba"}},{"ruleId":"D1","level":"warning","message":{"text":"VimMotionGroupBase.getMotionRange (cyclomatic 28): VimMotionGroupBase.getMotionRange 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"f46d6d2b89329d3fb1482319b553c2ea69767f52a01101792e8e82f78673d193"}},{"ruleId":"D1","level":"warning","message":{"text":"VimRegisterGroupBase.storeTextInternal (cyclomatic 28): VimRegisterGroupBase.storeTextInternal 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd709aeafdf12406e7d1390abc17efb006293826ab5c4a44e88e0286bb6f565b"}},{"ruleId":"D1","level":"warning","message":{"text":"VimShortcutKeyAction.isEnabled (cyclomatic 28): VimShortcutKeyAction.isEnabled has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/action/VimShortcutKeyAction.kt"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"334821bf4fee639e961bda05a52c5b97f865850738de367ed1f3fd1fd76c10c8"}},{"ruleId":"D1","level":"warning","message":{"text":"VimChangeGroupBase.changeNumberInRange (cyclomatic 27): VimChangeGroupBase.changeNumberInRange 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":1977}}}],"partialFingerprints":{"codehealthFindingId/v1":"988cd866a214e0208243e4ae2b0bc31f75a2079be953e6d8bf48e03f25788d39"}},{"ruleId":"D1","level":"warning","message":{"text":"FunctionCommand.processCommand (cyclomatic 26): FunctionCommand.processCommand has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FunctionCommand.kt"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9f2100b86c4f5c10484afacad1211231570a6ac5d92ab391eb54e37ffe245d0"}},{"ruleId":"D1","level":"warning","message":{"text":"VimPutBase.prepareDocumentAndGetStartOffsets (cyclomatic 25): VimPutBase.prepareDocumentAndGetStartOffsets 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"69641f42f36a2fc71ee94c7ff213494459283a80c870a3eaaf419a3db6cb6f0d"}},{"ruleId":"D1","level":"warning","message":{"text":"UtilKt.getModeForeground (cyclomatic 25): UtilKt.getModeForeground 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":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"845d1a80a959bf7bc1c2199309fbfe77207ab9abf426562ab3ca7c263c000a40"}},{"ruleId":"D1","level":"warning","message":{"text":"MapFilterFunctionHandlerBase.doFunction (cyclomatic 24): MapFilterFunctionHandlerBase.doFunction has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/MapFunctionHandlers.kt"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"6058733ac1d78285359fe8b6581a534476bf93c39a0db67cc9c636cf35590efd"}},{"ruleId":"D1","level":"warning","message":{"text":"CollectionElementVisitor.cleanLiteralChar (cyclomatic 23): CollectionElementVisitor.cleanLiteralChar has cyclomatic complexity 23 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/CollectionElementVisitor.kt"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed9400928ac6ed6bad1c692585d8583787b2cc6457d6568db4151d11a4e5dfb"}},{"ruleId":"D1","level":"warning","message":{"text":"ColLineFunctionHandlerKt.variableToPosition (cyclomatic 22): ColLineFunctionHandlerKt.variableToPosition has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/cursorFunctions/ColLineFunctionHandler.kt"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"956a96372d726b5b13d1219c74d694c4423cd47a11345fe72f263163cd6d3f1a"}},{"ruleId":"D1","level":"warning","message":{"text":"VimTemplateManagerListener.templateStarted (cyclomatic 22): VimTemplateManagerListener.templateStarted has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/IdeaSpecifics.kt"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fc16878b684cd5b67b21a78d3a03fbce7da38a6594967107f621ab5e017953d"}},{"ruleId":"D1","level":"warning","message":{"text":"SearchGroupKt.findBlockRange (cyclomatic 21): SearchGroupKt.findBlockRange has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e4b4516c48a8845ff057292c10105d703b86e9726b466ce26958ed5b9c8cb36"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchHelperBase.findPattern (cyclomatic 20): VimSearchHelperBase.findPattern 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73ee8a1460501c202ad4d2306f7b0319b820904563e31cff3c31f70cc3468f7"}},{"ruleId":"D1","level":"warning","message":{"text":"MotionGroup.getMotionRange2 (cyclomatic 20): MotionGroup.getMotionRange2 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":"src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fc609afcd70aafc5a1e0603c0dd050b91966323533aa8d62956fc0e9d02b9ca"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchHelperBase.findBlockTagRange (cyclomatic 19): VimSearchHelperBase.findBlockTagRange 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1851}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd11fc2774c9e0fffc04da8c042c4010190bce47875d36a9120661bf2ca27916"}},{"ruleId":"D1","level":"warning","message":{"text":"VimStringParserBase.parseKeys (cyclomatic 19): VimStringParserBase.parseKeys 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. This is NOT this file\u0027s highest cyclomatic complexity: VimStringParserBase.getVimKeyName (cyclomatic 63) 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParserBase.kt"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc1431f07cccecd25d48ec5b46366a87013d199a712d0a18e14e0dda26e1b75e"}},{"ruleId":"D1","level":"warning","message":{"text":"ModesKt.toMode (cyclomatic 19): ModesKt.toMode 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. This is NOT this file\u0027s highest cyclomatic complexity: ModesKt.toEngineMode (cyclomatic 21) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/Modes.kt"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"55ce893388b2d14735d39395cbac979d21e163b8cced01b60b6e07d696d5bbec"}},{"ruleId":"D1","level":"warning","message":{"text":"VimVariableServiceBase.convertToKotlinType (cyclomatic 19): VimVariableServiceBase.convertToKotlinType 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/services/VimVariableServiceBase.kt"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc7bba884099b94b2b0ae1bbefb7636bdaf80f0d9a81998a19f5a83831375f1"}},{"ruleId":"D1","level":"warning","message":{"text":"VimActionListener.beforeActionPerformed (cyclomatic 19): VimActionListener.beforeActionPerformed 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":"src/main/java/com/maddyhome/idea/vim/listener/IdeaSpecifics.kt"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"11328b21a15d55df06e02abedce2412e1c287590c968a5098cb0e183ac6cd501"}},{"ruleId":"D1","level":"warning","message":{"text":"BracketNormalizer.normalize (cyclomatic 18): BracketNormalizer.normalize 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/BracketNormalizer.kt"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bfd28b1d7092ab99eaa11eba294177a6511ef20468a127a558ba8e627ef5637"}},{"ruleId":"D1","level":"warning","message":{"text":"HistoryCommand.processCommand (cyclomatic 18): HistoryCommand.processCommand 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/HistoryCommand.kt"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"f06543475a75dacd0813ea080cbc6bc0f2c3dfa42aeb5e0a0ec316307e6000e4"}},{"ruleId":"D1","level":"warning","message":{"text":"TabCloseCommand.getTabIndexToClose (cyclomatic 18): TabCloseCommand.getTabIndexToClose 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/TabCloseCommand.kt"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"df98dc89c1ae474d75566dc737a41c25e1c6747ebfc1ef3ff6e25a246b8fef1c"}},{"ruleId":"D1","level":"warning","message":{"text":"CamelCaseMotionKt.isSubWordStart (cyclomatic 18): CamelCaseMotionKt.isSubWordStart has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/camelcasemotion/CamelCaseMotion.kt"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"f27dc9f735630fb923de06595f24872156a96fb151e65b983e7c482bc6350ea4"}},{"ruleId":"D1","level":"warning","message":{"text":"VimChangeGroupBase.indentRange (cyclomatic 17): VimChangeGroupBase.indentRange 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":2407}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf699ba7aa4195354bbac0e964d486df546d63309b8c7faab930e0bf379f9d5d"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchGroupBase.runSubstitute (cyclomatic 17): VimSearchGroupBase.runSubstitute 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3f21a9438cfd25fe64abf3a12a831218a6c78e65511c262b80a52a44aecb873"}},{"ruleId":"D1","level":"warning","message":{"text":"SearchGroupKt.findBlock (cyclomatic 17): SearchGroupKt.findBlock 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"66576082f3b6d2e51b9d4710d0d6349aa2da0fcaad02fffa3953b0a033196c0b"}},{"ruleId":"D1","level":"warning","message":{"text":"VimPutBase.moveCaretToEndPosition (cyclomatic 17): VimPutBase.moveCaretToEndPosition 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fec49b8d9579838de9059a91d48d7040c61279f63cfa7a40d506f712513111c"}},{"ruleId":"D1","level":"warning","message":{"text":"BracketNormalizer.findCollectionEnd (cyclomatic 17): BracketNormalizer.findCollectionEnd 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/BracketNormalizer.kt"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"717a30fe76530bf7c262f9bad93c0fd6bcc6cbed3da656d20b5be039ff9f7e31"}},{"ruleId":"D1","level":"warning","message":{"text":"DefinedFunctionHandler.executeFunctionBody (cyclomatic 17): DefinedFunctionHandler.executeFunctionBody 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/DefinedFunctionHandler.kt"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b3c6f74f61fdfe3a01097dd4a044f8deafb1a22c1382ecb45e726d307a461cf"}},{"ruleId":"D1","level":"warning","message":{"text":"SortUniqFunctionHandlerBase.doFunction (cyclomatic 17): SortUniqFunctionHandlerBase.doFunction 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/SortUniqFunctionHandlers.kt"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b2c03133dcfc23a3ba86542317176cd48bf5fc1306781289d707d3795adf92"}},{"ruleId":"D1","level":"warning","message":{"text":"IjVimPluginActivator.updateState (cyclomatic 17): IjVimPluginActivator.updateState 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":"src/main/java/com/maddyhome/idea/vim/IjVimPluginActivator.kt"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc638a74df3adea499075449bd8b1c6b143e39be199602c13b72f1acfbf1d68b"}},{"ruleId":"D1","level":"warning","message":{"text":"Operator.compareExchanges (cyclomatic 17): Operator.compareExchanges 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":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"62a8cbdce75504d906cf30c57165598f6ea051d73ad1d580e805bfbdbb8153ce"}},{"ruleId":"D1","level":"warning","message":{"text":"VimScriptExecutorBase.execute (cyclomatic 16): VimScriptExecutorBase.execute 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimScriptExecutorBase.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b41f79ec4bd6f1982fa5e5a2983a7835529b084237cf575ec84aabdc8819f14"}},{"ruleId":"D1","level":"warning","message":{"text":"VimSearchHelperBase.findNextSentenceEnd (cyclomatic 16): VimSearchHelperBase.findNextSentenceEnd has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":988}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb96398c0ee3147f84c5437bf1e2fe4ebf44688848c7bea50ec75be0d31f1f10"}},{"ruleId":"D1","level":"warning","message":{"text":"SetCommandKt.showOptions (cyclomatic 16): SetCommandKt.showOptions 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bec5f88c23404c4f97f3ff37767dafb29eca4624f58833ab4f7b65ec5a8f523"}},{"ruleId":"D1","level":"warning","message":{"text":"AssignmentOperator.validateValues (cyclomatic 16): AssignmentOperator.validateValues 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/operators/AssignmentOperator.kt"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"c28ba231dca060e249c9ba23c9504b67663713fc7ae1141d0b647975a8604980"}},{"ruleId":"D1","level":"warning","message":{"text":"ForLoop.execute (cyclomatic 16): ForLoop.execute 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6bdfad4f816164da4f662f30f8f49d4ec5f8a32f455200e39f66db60d957693"}},{"ruleId":"D1","level":"warning","message":{"text":"FileTypePatterns.getMatchitPatterns (cyclomatic 16): FileTypePatterns.getMatchitPatterns has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/matchit/Matchit.kt"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"33aebb54d09e5acf956007739d4ec8367be8099721d8b5e1c6bc87a9433e54ed"}},{"ruleId":"D2","level":"warning","message":{"text":"VimStringParserBase.parseVimScriptString (cognitive 110): VimStringParserBase.parseVimScriptString has cognitive complexity 110 (threshold 15). Drivers by points: if/else 47 (105 pts), boolean chains 2, match/switch 1 (2 pts), loops 1 (nesting depth added 59). 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParserBase.kt"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"443b81c3aa56690d94913d39b781832b664e309b7af01ce49c7dd4ee4b381e1e"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findSentenceEnd (cognitive 102): VimSearchHelperBase.findSentenceEnd has cognitive complexity 102 (threshold 15). Drivers by points: if/else 27 (73 pts), boolean chains 16, loops 4 (13 pts) (nesting depth added 55). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1117}}}],"partialFingerprints":{"codehealthFindingId/v1":"83b5a804c41f29a193e9e7730d39025b215f776d0198769f40446306d546591b"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findSentenceRangeEnd (cognitive 102): VimSearchHelperBase.findSentenceRangeEnd has cognitive complexity 102 (threshold 15). Drivers by points: if/else 44 (73 pts), boolean chains 28, loops 1 (nesting depth added 29). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1249}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ebbff390e85feb2286e1eb43c2c4085643ce59133ca5c4971143337a954cb2e"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchGroupBase.parseSubstituteCommand (cognitive 92): VimSearchGroupBase.parseSubstituteCommand has cognitive complexity 92 (threshold 15). Drivers by points: if/else 41 (71 pts), boolean chains 12, loops 4 (6 pts), match/switch 2 (3 pts) (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1186}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cc5e61c18105a13286aa7b51a0fb0c9f47d80846fa58a41ce0489d1765a8af2"}},{"ruleId":"D2","level":"warning","message":{"text":"IndentObjectHandler.getRange (cognitive 68): IndentObjectHandler.getRange has cognitive complexity 68 (threshold 15). Drivers by points: if/else 22 (43 pts), loops 11 (17 pts), boolean chains 8 (nesting depth added 27). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/textobjindent/VimIndentObject.kt"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"d040f263247ab68e732f222379e3629232051d14dfb5b8cecc86a2328ba928d4"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchGroupBase.findItOffset (cognitive 67): VimSearchGroupBase.findItOffset has cognitive complexity 67 (threshold 15). Drivers by points: if/else 35 (61 pts), boolean chains 5, match/switch 1 (nesting depth added 26). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1477}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a600b282f0369fe177e0bc0d4f65ab19d8f4fde322ca6c44292d6f99217ba4"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findWordObject (cognitive 59): VimSearchHelperBase.findWordObject has cognitive complexity 59 (threshold 15). Drivers by points: if/else 22 (35 pts), boolean chains 18, loops 2 (5 pts), match/switch 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1663}}}],"partialFingerprints":{"codehealthFindingId/v1":"b17ae3a77ba398abcf7d8d2deee270ec756a4fd212d4d2537f5ca2569d4baf3f"}},{"ruleId":"D2","level":"warning","message":{"text":"VimPutBase.prepareDocumentAndGetStartOffsets (cognitive 57): VimPutBase.prepareDocumentAndGetStartOffsets has cognitive complexity 57 (threshold 15). Drivers by points: if/else 22 (39 pts), match/switch 5 (14 pts), boolean chains 4 (nesting depth added 26). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"c83474b3dc8a1ad2509e3ca0800e7ebe9a9b75952fdf114537a8d6604fbcae69"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findSentenceStart (cognitive 54): VimSearchHelperBase.findSentenceStart has cognitive complexity 54 (threshold 15). Drivers by points: if/else 23 (37 pts), boolean chains 13, loops 2 (4 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1034}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd42c875a439a708aac55759a899fe9190db09252d6237d9e542aa2d5e0c0bac"}},{"ruleId":"D2","level":"warning","message":{"text":"VimMotionGroupBase.getMotionRange (cognitive 50): VimMotionGroupBase.getMotionRange has cognitive complexity 50 (threshold 15). Drivers by points: if/else 24 (45 pts), boolean chains 4, match/switch 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf6e2afbbc8b6e4f5c50f89226eb9b2743607612cc952352bf56491c206d12c5"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphemesKt.nextBoundary (cognitive 50): GraphemesKt.nextBoundary has cognitive complexity 50 (threshold 15). Drivers by points: if/else 16 (37 pts), boolean chains 12, loops 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/Graphemes.kt"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"718e9ba1beb7871ddc088324f6e430da455857a6007e738fdb73ef6970f4d40e"}},{"ruleId":"D2","level":"warning","message":{"text":"VimChangeGroupBase.indentRange (cognitive 48): VimChangeGroupBase.indentRange has cognitive complexity 48 (threshold 15). Drivers by points: if/else 15 (34 pts), loops 4 (13 pts), boolean chains 1 (nesting depth added 28). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":2407}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3c4082d291c0d50ac95f1e2229000759c4c813e2661ceea9f8564922ee665d0"}},{"ruleId":"D2","level":"warning","message":{"text":"VimChangeGroupBase.findNumberInText (cognitive 45): VimChangeGroupBase.findNumberInText has cognitive complexity 45 (threshold 15). Drivers by points: if/else 18 (33 pts), boolean chains 9, loops 2 (3 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":2163}}}],"partialFingerprints":{"codehealthFindingId/v1":"5610dec03d1770c0e7048939f9cdcabbd65d21a9d10474337acbb504c3724aa9"}},{"ruleId":"D2","level":"warning","message":{"text":"FunctionCommand.processCommand (cognitive 45): FunctionCommand.processCommand has cognitive complexity 45 (threshold 15). Drivers by points: if/else 22 (39 pts), boolean chains 6 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FunctionCommand.kt"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef2e4b5382059b193040d26e56b406b1074950a34aec27773dbad2e39e7117d"}},{"ruleId":"D2","level":"warning","message":{"text":"MapFilterFunctionHandlerBase.doFunction (cognitive 45): MapFilterFunctionHandlerBase.doFunction has cognitive complexity 45 (threshold 15). Drivers by points: if/else 17 (35 pts), loops 3 (6 pts), boolean chains 3, match/switch 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/MapFunctionHandlers.kt"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fe992a4f32c629b9049b42ccf681637eaff12eaec19690bba18eaaaf55548d9"}},{"ruleId":"D2","level":"warning","message":{"text":"VimChangeGroupBase.changeNumberInRange (cognitive 43): VimChangeGroupBase.changeNumberInRange has cognitive complexity 43 (threshold 15). Drivers by points: if/else 19 (35 pts), boolean chains 6, loops 1 (2 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":1977}}}],"partialFingerprints":{"codehealthFindingId/v1":"c131fd94f7d1a41b9efe9db1082a9cb9f8bafceffe25395016bed1bc7d3dd940"}},{"ruleId":"D2","level":"warning","message":{"text":"DigraphSequence.processKey (cognitive 43): DigraphSequence.processKey has cognitive complexity 43 (threshold 15). Drivers by points: if/else 17 (36 pts), match/switch 3 (5 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6c6823ffad00d5721b6a32978c5d6a03656c942ca0cf4085f14a6002a5da421"}},{"ruleId":"D2","level":"warning","message":{"text":"VimRegisterGroupBase.storeTextInternal (cognitive 43): VimRegisterGroupBase.storeTextInternal has cognitive complexity 43 (threshold 15). Drivers by points: if/else 21 (31 pts), boolean chains 9, loops 1 (3 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4361489dce93658038be5f49a9347468655906b6cf7a07ccb8c77716224e30f"}},{"ruleId":"D2","level":"warning","message":{"text":"SetCommandKt.parseOptionLine (cognitive 41): SetCommandKt.parseOptionLine has cognitive complexity 41 (threshold 15). Drivers by points: if/else 14 (22 pts), match/switch 4 (11 pts), boolean chains 7, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"84367b6649a2829e90528368f05e51414370b601af3e26eaca44400bf032fe3f"}},{"ruleId":"D2","level":"warning","message":{"text":"VimStringParserBase.parseKeys (cognitive 40): VimStringParserBase.parseKeys has cognitive complexity 40 (threshold 15). Drivers by points: if/else 15 (32 pts), match/switch 2 (5 pts), boolean chains 2, loops 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParserBase.kt"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"486926ba88f88cdef06da2a73805d0417913a7812617b4d23d6fec35bf1613d0"}},{"ruleId":"D2","level":"warning","message":{"text":"SearchGroupKt.findBlockRange (cognitive 38): SearchGroupKt.findBlockRange has cognitive complexity 38 (threshold 15). Drivers by points: if/else 14 (28 pts), boolean chains 5, loops 2 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"b15ebe73702ff4e7d8fe208bbfffdbeffc7c7d3f88800221b5ac1e7333b0ff0d"}},{"ruleId":"D2","level":"warning","message":{"text":"VimTemplateManagerListener.templateStarted (cognitive 37): VimTemplateManagerListener.templateStarted has cognitive complexity 37 (threshold 15). Drivers by points: if/else 16 (30 pts), boolean chains 6, match/switch 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/IdeaSpecifics.kt"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"794ff9074d0ace833457c6f1f99d297203d84560a6a492dc38794cfff156ba8b"}},{"ruleId":"D2","level":"warning","message":{"text":"RegisterGroup.readData (cognitive 36): RegisterGroup.readData has cognitive complexity 36 (threshold 15). Drivers by points: if/else 11 (22 pts), loops 2 (6 pts), ternaries 1 (5 pts), error handling 1 (3 pts) (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/RegisterGroup.java"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"526bb55bf4d5fa10442da0c9867640c783cb8bf7b0716a9ea0705143c6aea735"}},{"ruleId":"D2","level":"warning","message":{"text":"VimShortcutKeyAction.isEnabled (cognitive 35): VimShortcutKeyAction.isEnabled has cognitive complexity 35 (threshold 15). Drivers by points: if/else 20 (26 pts), boolean chains 8, match/switch 1 (nesting depth added 6). 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":"src/main/java/com/maddyhome/idea/vim/action/VimShortcutKeyAction.kt"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca20f538c51480317eed1542b100da57e785915326c863e2968a1caf3911dc8b"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findPattern (cognitive 34): VimSearchHelperBase.findPattern has cognitive complexity 34 (threshold 15). Drivers by points: if/else 21 (31 pts), boolean chains 1, error handling 1, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"4311e22275c4cad12ae4147d7399f9a67f6bea0a7e37df071b4b5c86129e62de"}},{"ruleId":"D2","level":"warning","message":{"text":"ForLoop.execute (cognitive 34): ForLoop.execute has cognitive complexity 34 (threshold 15). Drivers by points: if/else 14 (24 pts), loops 4 (10 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"d34e284d4fa97d2b337e879d3c75f4227b5d91e5e140091ea5c62bf51185b08d"}},{"ruleId":"D2","level":"warning","message":{"text":"VimChangeGroupBase.repeatInsert (cognitive 33): VimChangeGroupBase.repeatInsert has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (28 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"13595fc28d1e26c9667c6bd535bfe8832ea661ef6a63dcf79c29ccb8bf8e7667"}},{"ruleId":"D2","level":"warning","message":{"text":"IjVimPluginActivator.updateState (cognitive 33): IjVimPluginActivator.updateState has cognitive complexity 33 (threshold 15). Drivers by points: if/else 11 (27 pts), boolean chains 6 (nesting depth added 16). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/IjVimPluginActivator.kt"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"31226e51d5a6b5a239d5a980795cfb568b03a8b6c354ef5e7c4d5e971b0b48a3"}},{"ruleId":"D2","level":"warning","message":{"text":"MotionGroup.getMotionRange2 (cognitive 32): MotionGroup.getMotionRange2 has cognitive complexity 32 (threshold 15). Drivers by points: if/else 15 (27 pts), boolean chains 4, match/switch 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":"src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"a285336509fb899b5b9b003dbdcfeeb1fc5dc8e6cca32b7f3ae32cbc15c342ef"}},{"ruleId":"D2","level":"warning","message":{"text":"VimScriptExecutorBase.execute (cognitive 31): VimScriptExecutorBase.execute has cognitive complexity 31 (threshold 15). Drivers by points: if/else 11 (23 pts), error handling 3 (6 pts), boolean chains 1, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimScriptExecutorBase.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b34946fd60e2e875727b7ea73e179e454c1e10d8e917e892e05ac966fa52edb"}},{"ruleId":"D2","level":"warning","message":{"text":"VimVariableServiceBase.convertToKotlinType (cognitive 31): VimVariableServiceBase.convertToKotlinType has cognitive complexity 31 (threshold 15). Drivers by points: if/else 15 (23 pts), loops 2 (6 pts), boolean chains 1, match/switch 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/services/VimVariableServiceBase.kt"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c4beab68d7f33fc0eff5f5cf6f4eef090581543cb4a53ec17bc3d46ea626fda"}},{"ruleId":"D2","level":"warning","message":{"text":"UtilKt.getModeBackground (cognitive 31): UtilKt.getModeBackground has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 7 (18 pts), if/else 7 (9 pts), error handling 1 (4 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":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd06cd3d95cf0e2017d1793546b45f73d7d5408092e77d4554acc2c1938b36fe"}},{"ruleId":"D2","level":"warning","message":{"text":"VimPutBase.moveCaretToEndPosition (cognitive 30): VimPutBase.moveCaretToEndPosition has cognitive complexity 30 (threshold 15). Drivers by points: if/else 14 (24 pts), match/switch 4 (6 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c27a4f06c952a238e4270fc3cb0a8e567626709b310fbd7193ad92ef415411b"}},{"ruleId":"D2","level":"warning","message":{"text":"ColLineFunctionHandlerKt.variableToPosition (cognitive 30): ColLineFunctionHandlerKt.variableToPosition has cognitive complexity 30 (threshold 15). Drivers by points: if/else 17 (25 pts), boolean chains 5 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/cursorFunctions/ColLineFunctionHandler.kt"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac34c6c5872f938d33ade97cf49bc895826b6f71e0ec4ba5c2d4bc62775ee1fe"}},{"ruleId":"D2","level":"warning","message":{"text":"SearchGroupKt.findBlock (cognitive 29): SearchGroupKt.findBlock has cognitive complexity 29 (threshold 15). Drivers by points: if/else 15 (25 pts), boolean chains 3, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9e2d2b7ded6111b74e41acba42e5e356e44da3e9b8ae0609167fcbfe480b0d2"}},{"ruleId":"D2","level":"warning","message":{"text":"UtilKt.getModeForeground (cognitive 29): UtilKt.getModeForeground has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 5 (12 pts), error handling 1 (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":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"1256c414dad896f54b621248daef1f0187bbaa98943a2652e87e17fae06c9abc"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findBlockTagRange (cognitive 28): VimSearchHelperBase.findBlockTagRange has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (15 pts), loops 4 (7 pts), boolean chains 6 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1851}}}],"partialFingerprints":{"codehealthFindingId/v1":"bebfdcf6cb9d7faf08d797efa3c6d23077eeea604da176ee60568b6b1df4814b"}},{"ruleId":"D2","level":"warning","message":{"text":"VimActionListener.beforeActionPerformed (cognitive 28): VimActionListener.beforeActionPerformed has cognitive complexity 28 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 6 (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":"src/main/java/com/maddyhome/idea/vim/listener/IdeaSpecifics.kt"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"43a15b06224dd8700e6314d310efbb90545c8f6af06ec4de709c0e868c693246"}},{"ruleId":"D2","level":"warning","message":{"text":"BufferCommand.processCommand (cognitive 28): BufferCommand.processCommand has cognitive complexity 28 (threshold 15). Drivers by points: if/else 12 (24 pts), match/switch 1 (3 pts), boolean chains 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/vimscript/model/commands/BufferCommand.kt"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0a073a7e466b9b151d42903207031ad28d818ffc8ed33b7019280f51f90ef37"}},{"ruleId":"D2","level":"warning","message":{"text":"VimChangeGroupBase.changeRange (cognitive 27): VimChangeGroupBase.changeRange has cognitive complexity 27 (threshold 15). Drivers by points: if/else 13 (25 pts), boolean chains 2 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":1712}}}],"partialFingerprints":{"codehealthFindingId/v1":"a386a207f0ca5825b7b2fba4b41c50d8ddb9f8abf5cabc0d3228fbcc9bd4dbd1"}},{"ruleId":"D2","level":"warning","message":{"text":"SearchGroupKt.findBlockLocation (cognitive 27): SearchGroupKt.findBlockLocation has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (20 pts), boolean chains 4, match/switch 1 (2 pts), loops 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"1def14ed496e0c0717002f7914576b93f18e95e5a0a1d2540d121892278d7b0f"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphemesKt.classify (cognitive 26): GraphemesKt.classify has cognitive complexity 26 (threshold 15). Drivers by points: match/switch 8 (14 pts), if/else 10 (12 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/Graphemes.kt"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcb9485544c77acf27d21215b5a244ab3529dbfef31ca5040e466bd31d2e8115"}},{"ruleId":"D2","level":"warning","message":{"text":"VimRegex.buildSubstituteString (cognitive 26): VimRegex.buildSubstituteString has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (19 pts), match/switch 2 (4 pts), boolean chains 2, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/VimRegex.kt"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dc96bf872928df0b6fe40a47ecef59f3ec15b65917a575d5dd2cc3476822ea2"}},{"ruleId":"D2","level":"warning","message":{"text":"BracketNormalizer.normalize (cognitive 26): BracketNormalizer.normalize has cognitive complexity 26 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 5, match/switch 1 (3 pts), loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/BracketNormalizer.kt"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9138076fb265c28ba159b90af5a9270e18dbd451ba5079f32d1629d8b53530d"}},{"ruleId":"D2","level":"warning","message":{"text":"ArgBoundsFinder.skipSexp (cognitive 26): ArgBoundsFinder.skipSexp has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (24 pts), boolean chains 1, loops 1 (nesting depth added 13). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/argtextobj/VimArgTextObjExtension.kt"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"d07e09af4da8818660ef299f0febec9e48410d91f4c5c4a882ac0c63f8e3ea1f"}},{"ruleId":"D2","level":"warning","message":{"text":"CountFunctionHandler.doFunction (cognitive 25): CountFunctionHandler.doFunction has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (21 pts), loops 1 (2 pts), boolean chains 1, 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/CountFunctionHandler.kt"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed26bfa5539f2c006b8eefa97138c9ac562bdff5b536b4ad1210299159005408"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtendFunctionHandlerBase.doFunction (cognitive 25): ExtendFunctionHandlerBase.doFunction has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12 (20 pts), match/switch 1 (3 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/ExtendFunctionHandlers.kt"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"36685de8020919319e736e7dbc7326ec2eafb5f58926a1587d885e4f22015e20"}},{"ruleId":"D2","level":"warning","message":{"text":"selectTicketForAnalysis.main (cognitive 25): selectTicketForAnalysis.main has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (17 pts), loops 2 (4 pts), ternaries 1 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/selectTicketForAnalysis.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"5807a8fb52d36b17754d9085d1093d4a4103370758c448459e87a71b68c4cbed"}},{"ruleId":"D2","level":"warning","message":{"text":"VimMarkServiceBase.updateMarksFromDelete (cognitive 24): VimMarkServiceBase.updateMarksFromDelete has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (19 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMarkServiceBase.kt"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b79b87fbb317775452734397979a2853e763702fa3dc9d52864a1494341cf0a"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findInnerParagraphRange (cognitive 24): VimSearchHelperBase.findInnerParagraphRange has cognitive complexity 24 (threshold 15). Drivers by points: if/else 15 (22 pts), boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1522}}}],"partialFingerprints":{"codehealthFindingId/v1":"5724743b8b32e96953c7ce1dcc1e665103fef6ae1fdb46014341bcc70c9120bd"}},{"ruleId":"D2","level":"warning","message":{"text":"GlobalCommand.processGlobalCommand (cognitive 24): GlobalCommand.processGlobalCommand has cognitive complexity 24 (threshold 15). Drivers by points: if/else 14 (20 pts), boolean chains 3, error handling 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/GlobalCommand.kt"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"39bce5f9918a82bc3781d5fcec5d5aa11a4cdffe9515eec30aed23298f0a147a"}},{"ruleId":"D2","level":"warning","message":{"text":"BacktrackingStrategy.simulate (cognitive 23): BacktrackingStrategy.simulate has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 4, loops 2 (3 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/strategies/BacktrackingStrategy.kt"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"51d1c7ae12f59ee4ceb031e25b5ef7d4f1b265de00aae384289ad1c7e9bc24c9"}},{"ruleId":"D2","level":"warning","message":{"text":"CollectionElementVisitor.cleanLiteralChar (cognitive 23): CollectionElementVisitor.cleanLiteralChar has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12, boolean chains 11. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/CollectionElementVisitor.kt"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"27131d5460bbc294153c20430303a6ae4915f4dec742302dec7020872ade957a"}},{"ruleId":"D2","level":"warning","message":{"text":"WindowGroup.findWindowsInRow (cognitive 23): WindowGroup.findWindowsInRow has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 6 (14 pts), if/else 3 (6 pts), boolean chains 2, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"172f891cd22b17236af36d5309cd0ea677d6e7652383eab32aa9a58b1bce1ff8"}},{"ruleId":"D2","level":"warning","message":{"text":"VimChangeGroupBase.changeMotion (cognitive 22): VimChangeGroupBase.changeMotion has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 4, match/switch 1 (3 pts) (nesting depth added 10). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":1576}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1ce2032b763fd4f637e6ac9ab42b3a6aa5abe368b82aa9f98db6790f3f71570"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchGroupBase.runSubstitute (cognitive 22): VimSearchGroupBase.runSubstitute has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (17 pts), boolean chains 4, error handling 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c69c9bb4d09f1627adc89941c3be93d03c50b86fa9cfcca4f1fde9669d45921"}},{"ruleId":"D2","level":"warning","message":{"text":"EngineStringHelper.scanPrintable (cognitive 22): EngineStringHelper.scanPrintable has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 3, 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/helper/EngineStringHelper.kt"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"85353ad6319d9692bdd0ad80c4e2ea86f215cebc12ff17a7dda9e31671773cc9"}},{"ruleId":"D2","level":"warning","message":{"text":"BracketNormalizer.findCollectionEnd (cognitive 22): BracketNormalizer.findCollectionEnd has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 7, match/switch 1 (2 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/BracketNormalizer.kt"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd203ba71ac7884a306b2f3c715cfd0b0c465686ae95f3b5dd253d0e927151bf"}},{"ruleId":"D2","level":"warning","message":{"text":"SetCommandKt.showOptions (cognitive 22): SetCommandKt.showOptions has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (13 pts), loops 5 (6 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceffb7226fd382deaf4ab1835db264b4d258db9a1716bbc739e448f956082730"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findWordAtOrFollowingCursor (cognitive 21): VimSearchHelperBase.findWordAtOrFollowingCursor has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (9 pts), loops 3 (7 pts), boolean chains 5 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"043919fccbd05952205a4bdeaf70efab06f46aaf8a9893b9c93a8ba29415a712"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findBlockQuoteInLineRange (cognitive 21): VimSearchHelperBase.findBlockQuoteInLineRange has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 2 (5 pts), boolean chains 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":777}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a36d43d76b71fbe3926d94b89ec2fb27226f4d47228ce71a628e639c03fd63"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findNextSentenceEnd (cognitive 21): VimSearchHelperBase.findNextSentenceEnd has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 7, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":988}}}],"partialFingerprints":{"codehealthFindingId/v1":"81efd084b3a3f8e0a4232a70558e5a486cb701c740c5caa1ec2f0f77114782aa"}},{"ruleId":"D2","level":"warning","message":{"text":"ModesKt.toMode (cognitive 21): ModesKt.toMode has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (16 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/Modes.kt"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"88c5a20923152a5edb8446a12e08b14097d066c77ba9613806960e8d741209e1"}},{"ruleId":"D2","level":"warning","message":{"text":"NormalCommand.processCommand (cognitive 21): NormalCommand.processCommand has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/NormalCommand.kt"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"18ce2f52cee2b85d79ea13e31466fe387c218675cf8a1feb262638180aaab7b9"}},{"ruleId":"D2","level":"warning","message":{"text":"SublistExpression.assign (cognitive 21): SublistExpression.assign has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (17 pts), loops 1 (2 pts), boolean chains 1, match/switch 1 (nesting depth added 7). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/SublistExpression.kt"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cc8438f5ab30a3a39948290f721b08204f84ed8153c756016542320773beb2a"}},{"ruleId":"D2","level":"warning","message":{"text":"DefinedFunctionHandler.executeFunctionBody (cognitive 21): DefinedFunctionHandler.executeFunctionBody has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (9 pts), match/switch 2 (5 pts), loops 2 (4 pts), error handling 1 (3 pts) (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/DefinedFunctionHandler.kt"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"1230e493b447be11de7f32b30b2a726c15e3d55662cc5eb2c7d18d1c3d2b200d"}},{"ruleId":"D2","level":"warning","message":{"text":"KeyGroup.getLocalActions (cognitive 21): KeyGroup.getLocalActions has cognitive complexity 21 (threshold 15). Drivers by points: if/else 3 (11 pts), loops 3 (8 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":"src/main/java/com/maddyhome/idea/vim/group/KeyGroup.java"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2476c4624a99ac60f572d4e0c60a49a450657f96b5f2f5ebd2ebf5bff359681"}},{"ruleId":"D2","level":"warning","message":{"text":"VimDigraphGroupBase.showDigraphs (cognitive 20): VimDigraphGroupBase.showDigraphs has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 2, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimDigraphGroupBase.kt"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c39cf57b24da9be54547bc65377a5b3c3c6cbb1a17d90dd06330c8018324c81"}},{"ruleId":"D2","level":"warning","message":{"text":"VimScriptFunctionServiceBase.deleteFunction (cognitive 20): VimScriptFunctionServiceBase.deleteFunction has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 2, match/switch 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimScriptFunctionServiceBase.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1b56b79949ab4f641c6701a47e61ac2eb708b8874d5c35932ac443e4068394"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findCamelEnd (cognitive 20): VimSearchHelperBase.findCamelEnd has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 5, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":748}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f7d3995d6a486a6958c34d909a5006569fe6d1d70d5d3265f6ea7fd0e5d24b1"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findNextSentenceStart (cognitive 20): VimSearchHelperBase.findNextSentenceStart has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 6, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"9af71c327b2f57460fdb178eba86d7b8534d6c7bab9dd09a57762ac0f1be292c"}},{"ruleId":"D2","level":"warning","message":{"text":"DigraphConsumer.consumeKey (cognitive 20): DigraphConsumer.consumeKey has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 1, 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/consumers/DigraphConsumer.kt"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf40179b23cbebb63c610cf6a7e6b2f95da5e5c76713777477cc8e01aaf78773"}},{"ruleId":"D2","level":"warning","message":{"text":"RemoveFunctionHandler.doFunction (cognitive 20): RemoveFunctionHandler.doFunction has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 2, match/switch 1 (nesting depth added 7). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/RemoveFunctionHandler.kt"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"4db78140b1ee71473e38ad60941c2125556e0861517d49a91bfba833e0b1924f"}},{"ruleId":"D2","level":"warning","message":{"text":"TryStatement.execute (cognitive 20): TryStatement.execute has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 1 (2 pts), error handling 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/TryStatement.kt"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"d27468f6a2e84697e7bc0811c2834a19890b17aa37b8211b913caa33fa076b95"}},{"ruleId":"D2","level":"warning","message":{"text":"VimVariableServiceBase.convertToVimDataType (cognitive 20): VimVariableServiceBase.convertToVimDataType has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 2 (4 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/services/VimVariableServiceBase.kt"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd41aef75a5f01285e1f944d2419a1a4f3c2ac7db421b81948ead6d562acce93"}},{"ruleId":"D2","level":"warning","message":{"text":"Operator.compareExchanges (cognitive 20): Operator.compareExchanges has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9, boolean chains 7, match/switch 2 (4 pts) (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":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe33f8dbb3ad55f910c74d0ebc5ab5eefaa2527f0227626648f2f59d2ac01187"}},{"ruleId":"D2","level":"warning","message":{"text":"VimMarkServiceImpl.readData (cognitive 20): VimMarkServiceImpl.readData has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (9 pts), loops 3 (7 pts), error handling 1 (3 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/VimMarkServiceImpl.kt"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dd643639a242cefff8e0719170b65bd4cc4037ad31dbb9775bf3052d3dff873"}},{"ruleId":"D2","level":"warning","message":{"text":"OutputPanel.handleHitEnterPrompt (cognitive 20): OutputPanel.handleHitEnterPrompt has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (17 pts), match/switch 2 (3 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":"src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt"},"region":{"startLine":702}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed4a4d9f24a94030dbad6ff80ae7b22cd8e9424e248e111faaa3816bbddcdc3e"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchGroupBase.processSearchCommand (cognitive 19): VimSearchGroupBase.processSearchCommand has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (19 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"19eb73881f9804b2956bfc5f0ce781eeb19546190954dd5d664278afb7acf708"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findCamelStart (cognitive 19): VimSearchHelperBase.findCamelStart has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 4, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":716}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b7e7e9d0b9c6b4f9a305a7d7de07c530ca390419b60f72fafec12813e741745"}},{"ruleId":"D2","level":"warning","message":{"text":"EngineVisualGroupKt.setVisualSelection (cognitive 19): EngineVisualGroupKt.setVisualSelection has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (14 pts), boolean chains 2, loops 1 (2 pts), match/switch 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/visual/EngineVisualGroup.kt"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"85044055e614eae4e890cb65ad566832b76008c117f6c0b0cbf5e9e94f1775d1"}},{"ruleId":"D2","level":"warning","message":{"text":"EditorResetConsumer.handleEditorReset (cognitive 19): EditorResetConsumer.handleEditorReset has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 2 (nesting depth added 9). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/consumers/EditorResetConsumer.kt"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"d796befc6840f36b5b892e1ee33d6b096bdc848705e9d3052f0ce9b5738a9ffc"}},{"ruleId":"D2","level":"warning","message":{"text":"VimRegex.findNext (cognitive 19): VimRegex.findNext has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 1 (2 pts), boolean chains 1, 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/VimRegex.kt"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"a67ea9bb67c4e35c1621c4b54ca8935f41977901a03baf0e40be2861d0232d7e"}},{"ruleId":"D2","level":"warning","message":{"text":"CmdCommand.addAlias (cognitive 19): CmdCommand.addAlias has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 3, match/switch 1 (3 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/CmdCommand.kt"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd814d9a4ca33c1c9ecf68dc08c4f86e9f58fa208cb8e3c70bb8d0a56b2ee4df"}},{"ruleId":"D2","level":"warning","message":{"text":"HistoryCommand.processCommand (cognitive 19): HistoryCommand.processCommand has cognitive complexity 19 (threshold 15). Drivers by points: if/else 13 (14 pts), boolean chains 5 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/HistoryCommand.kt"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2f8a254847841c6648cd7144804bd493c33b15d995909c7b2b3e447d9a9f666"}},{"ruleId":"D2","level":"warning","message":{"text":"ArgBoundsFinder.findOuterBrackets (cognitive 19): ArgBoundsFinder.findOuterBrackets has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (17 pts), boolean chains 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/argtextobj/VimArgTextObjExtension.kt"},"region":{"startLine":618}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9100b1510d4d40d79cab1d633037a591940ba2d5b6e8e6742b8bb59f05950df"}},{"ruleId":"D2","level":"warning","message":{"text":"ExEntryPanelService.inputString (cognitive 19): ExEntryPanelService.inputString has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 4, loops 1 (2 pts), match/switch 1 (2 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEntryPanelService.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9934d200ce6cabcd5653b330cc85c28fc4fe92c2d4e0436d59241a6f50b51ff"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchGroupBase.findEndOfPattern (cognitive 18): VimSearchGroupBase.findEndOfPattern has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (11 pts), boolean chains 6, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":478}}}],"partialFingerprints":{"codehealthFindingId/v1":"d518b6e76573e1a3cca14a1ea5ab3f84267c63bfba75e88dd87738391cc4c6c4"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findOuterParagraphRange (cognitive 18): VimSearchHelperBase.findOuterParagraphRange has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13 (16 pts), boolean chains 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1481}}}],"partialFingerprints":{"codehealthFindingId/v1":"60909da322aa8e90863fd2730aa7ff423d8aa06242174df255f6b613154c323f"}},{"ruleId":"D2","level":"warning","message":{"text":"TabCloseCommand.getTabIndexToClose (cognitive 18): TabCloseCommand.getTabIndexToClose has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 4 (7 pts), if/else 6, boolean chains 4, loops 1 (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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/TabCloseCommand.kt"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"81d599c768c244f29b5f16dccbb3ead89e20232e99f0b59c25331a9688e36efc"}},{"ruleId":"D2","level":"warning","message":{"text":"RangeFunctionHandler.doFunction (cognitive 18): RangeFunctionHandler.doFunction has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (11 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/RangeFunctionHandler.kt"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fac44984473d3c24b6197d6bd3415ce18e4c5771cffa3a409aefa3a77a9b59e"}},{"ruleId":"D2","level":"warning","message":{"text":"OutputPanel.updatePrompt (cognitive 18): OutputPanel.updatePrompt has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (18 pts) (nesting depth added 10). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt"},"region":{"startLine":640}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f3a1904ef0f52b7becd991675daa9b2203bd06889e58eebf72a08b022dddc5b"}},{"ruleId":"D2","level":"warning","message":{"text":"KeyGroup.readData (cognitive 18): KeyGroup.readData has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (13 pts), error handling 1 (3 pts), loops 1 (2 pts) (nesting depth added 12). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/KeyGroup.java"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a0f83005dab4888a3b1a9d07f42a745909be4a685def7aced2e37aafda4853c"}},{"ruleId":"D2","level":"warning","message":{"text":"VimChangeGroupBase.findRange (cognitive 17): VimChangeGroupBase.findRange has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 8, if/else 3 (5 pts), loops 3 (4 pts) (nesting depth added 3). 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":2258}}}],"partialFingerprints":{"codehealthFindingId/v1":"81df007e83ac0be7b9bf680e04fd08679b8ed74f0fe555582c75e9b52b6ce980"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.isInHTMLTag (cognitive 17): VimSearchHelperBase.isInHTMLTag has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (8 pts), boolean chains 7, loops 2 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1946}}}],"partialFingerprints":{"codehealthFindingId/v1":"c89cb4fa9242658ae69d5467105973a93aa54ed4fd5481005bc73ce3e97ac0a0"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchHelperBase.findUnmatchedClosingTag (cognitive 17): VimSearchHelperBase.findUnmatchedClosingTag has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":2012}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf38817144f6b9d439c707c43b64ef5f54694617b36af4ee31fabe2c5d432feb"}},{"ruleId":"D2","level":"warning","message":{"text":"VimStringParserBase.toKeyNotation (cognitive 17): VimStringParserBase.toKeyNotation has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12 (14 pts), error handling 1 (2 pts), boolean chains 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParserBase.kt"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"638a8c6f406bf4574ce1bb851365d2977a3354611f2031753cb69c05a3762844"}},{"ruleId":"D2","level":"warning","message":{"text":"ChangeEditorActionHandler.baseExecute (cognitive 17): ChangeEditorActionHandler.baseExecute has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 1, error handling 1, match/switch 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/ChangeEditorActionHandler.kt"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"047253cd45fd8a2612f8f37d8bb54a3fec877ed2b3c901177d1fad9aac691e44"}},{"ruleId":"D2","level":"warning","message":{"text":"VimPutBase.putTextBlockwise (cognitive 17): VimPutBase.putTextBlockwise has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 1, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"df096f7ceeedeba7fdb9b12c87a1f39e12f37971b39681346a4e8c730f9b24d2"}},{"ruleId":"D2","level":"warning","message":{"text":"TabMoveCommand.processCommand (cognitive 17): TabMoveCommand.processCommand has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 3, error handling 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/TabMoveCommand.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b3cf378a6c0b06cb33a36a5ecfe22375867c25fbd582b52821d327c8ab313d2"}},{"ruleId":"D2","level":"warning","message":{"text":"UnknownCommand.processPossiblyAliasCommand (cognitive 17): UnknownCommand.processPossiblyAliasCommand has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (14 pts), match/switch 1 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/UnknownCommand.kt"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4abf036c3cccea4a9a63a7fcc95a52b7f14b86e769dd356ab8f43baa63c36b5"}},{"ruleId":"D2","level":"warning","message":{"text":"IndexedExpression.evaluate (cognitive 17): IndexedExpression.evaluate has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4, match/switch 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/IndexedExpression.kt"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d97997a26eba7e01807990788a008ab91be8a93a42f5118085884cae10d386e"}},{"ruleId":"D2","level":"warning","message":{"text":"ForLoopWithList.execute (cognitive 17): ForLoopWithList.execute has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 2 (5 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3472ed94ed5c49389c7efe041f711314f959546730cfd8667383469159ffe9dd"}},{"ruleId":"D2","level":"warning","message":{"text":"MacroGroup.playbackKeys (cognitive 17): MacroGroup.playbackKeys has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (13 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/MacroGroup.kt"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"09a00f1e2a5ef2b90e5447db031984fcb92fffdeac4543d5430dba6bd414665f"}},{"ruleId":"D2","level":"warning","message":{"text":"ScrollGroup.scrollHalfPage (cognitive 17): ScrollGroup.scrollHalfPage has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (14 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":"src/main/java/com/maddyhome/idea/vim/group/ScrollGroup.kt"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"611e52641b72639f02c7ec8aef06da6e4fd13f499e6bef2c0a3be037ea960e6a"}},{"ruleId":"D2","level":"warning","message":{"text":"VimMarkServiceImpl.saveData (cognitive 17): VimMarkServiceImpl.saveData has cognitive complexity 17 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 3 (6 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/VimMarkServiceImpl.kt"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e282942ba157517a95b225d8ec47838cd88658ba81d2300f6cf173317960c87"}},{"ruleId":"D2","level":"warning","message":{"text":"VimActionsPromoter.promote (cognitive 17): VimActionsPromoter.promote has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (13 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":"src/main/java/com/maddyhome/idea/vim/key/VimActionsPromoter.kt"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed427dc973c39edebfe65273decb14809a1a7a31246d11f52030d28cb8f215dd"}},{"ruleId":"D2","level":"warning","message":{"text":"EditorMouseHandler.mouseClicked (cognitive 17): EditorMouseHandler.mouseClicked has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (15 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":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":1013}}}],"partialFingerprints":{"codehealthFindingId/v1":"6206562c55d701fe4da7cfb93c0e833d73dd704987cdf8f6f8f8801d614e5799"}},{"ruleId":"D2","level":"warning","message":{"text":"PsiHelper.addNavigationElements (cognitive 17): PsiHelper.addNavigationElements has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 1, loops 1 (nesting depth added 8). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/PsiHelper.java"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaa2cb13ffefd0d5abcddfdebdfd649cbb32eef15d79a38b1c98bb56f53dbf0d"}},{"ruleId":"D2","level":"warning","message":{"text":"VimSearchGroupBase.prepareRegex (cognitive 16): VimSearchGroupBase.prepareRegex has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 2 (3 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"d843a9a4d9d58ca27b1a2e732dde59af00180b6ea3ce9141cb7572f55db9686b"}},{"ruleId":"D2","level":"warning","message":{"text":"ToHandlerMappingInfo.myFun (cognitive 16): ToHandlerMappingInfo.myFun has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e6393737434178b55dbc1d11293137c938e590833143141242d8896b06afb7"}},{"ruleId":"D2","level":"warning","message":{"text":"AssignmentOperator.validateValues (cognitive 16): AssignmentOperator.validateValues has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), boolean chains 6, match/switch 1 (nesting depth added 4). 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/operators/AssignmentOperator.kt"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4489b54b06474b4b6f0679fd74fd3da062690971e876fc7b853ae7e8b75aa1c"}},{"ruleId":"D2","level":"warning","message":{"text":"IndexOfFunctionHandler.doFunction (cognitive 16): IndexOfFunctionHandler.doFunction has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (11 pts), boolean chains 2, 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/IndexOfFunctionHandler.kt"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"6447d42bdce72f8c373664f7358b23e56029b267b2917c5750845e4b8948ea72"}},{"ruleId":"D2","level":"warning","message":{"text":"IfStatement.execute (cognitive 16): IfStatement.execute has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (9 pts), error handling 1 (4 pts), loops 2 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/IfStatement.kt"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"1efdc0a32b1150e7fb18d2cb30104a6fc9a5935a2954eb73bac621564cccabde"}},{"ruleId":"D2","level":"warning","message":{"text":"VimShortcutKeyAction.actionPerformed (cognitive 16): VimShortcutKeyAction.actionPerformed has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), error handling 2 (4 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":"src/main/java/com/maddyhome/idea/vim/action/VimShortcutKeyAction.kt"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"499a5d3003191ebc9012788007b01fcf1735b4242090581f732da66dfdcdbf96"}},{"ruleId":"D2","level":"warning","message":{"text":"ArgBoundsFinder.findBoundsAt (cognitive 16): ArgBoundsFinder.findBoundsAt has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 4, loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/argtextobj/VimArgTextObjExtension.kt"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"48993ffdb0533575f063170cc243ca57122d21da2954f147ee8dc05a3f0be9a3"}},{"ruleId":"D2","level":"warning","message":{"text":"FileTypePatterns.getMatchitPatterns (cognitive 16): FileTypePatterns.getMatchitPatterns has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9, boolean chains 7. 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":"src/main/java/com/maddyhome/idea/vim/extension/matchit/Matchit.kt"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"10fe67d971b85e3f81f975833b02c091d9471c446a99dd00d59ecfc397970b0e"}},{"ruleId":"D2","level":"warning","message":{"text":"ReplaceWithRegisterNewApiKt.replaceTextAndUpdateCaret (cognitive 16): ReplaceWithRegisterNewApiKt.replaceTextAndUpdateCaret has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10 (16 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/replacewithregister/ReplaceWithRegisterNewApi.kt"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c3473ec8f74107f705fd689a0e8dc7325fea16a017aa79b9b6eae2f5c07ae85"}},{"ruleId":"D2","level":"warning","message":{"text":"IdeaSelectionControl.controlNonVimSelectionChange (cognitive 16): IdeaSelectionControl.controlNonVimSelectionChange has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/visual/IdeaSelectionControl.kt"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"7649dfe6a800d0f6094c92c37fce0c95206033aed57716f1a0b823276f64b08d"}},{"ruleId":"D2","level":"warning","message":{"text":"SearchHighlightsHelperKt.updateSearchHighlights (cognitive 16): SearchHighlightsHelperKt.updateSearchHighlights has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (9 pts), boolean chains 7 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/SearchHighlightsHelper.kt"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca78b7ae667e7a00dcb2d0ef6475975c11a0a8591e15ce2215574612919b8f90"}},{"ruleId":"D2","level":"warning","message":{"text":"UndoRedoHelper.performUndo (cognitive 16): UndoRedoHelper.performUndo has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (UndoRedoHelper.performRedo) 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":"src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e7ddc8e207153e902efc51e6b05d7588aba76a04de90ae97504a2ea7fdc0ef"}},{"ruleId":"D2","level":"warning","message":{"text":"UndoRedoHelper.performRedo (cognitive 16): UndoRedoHelper.performRedo has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body. This shape REPEATS in the file: one other method here (UndoRedoHelper.performUndo) 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":"src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e15bacbae943c57e11086593f4d786a7bf419bb4a3716e30390922219ab04f9"}},{"ruleId":"D2","level":"warning","message":{"text":"ExDocumentFilter.replace (cognitive 16): ExDocumentFilter.replace has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (11 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExDocument.kt"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"18fc8d3824ab32c9917c46abd31dad75390e65ad8649140e75e23cb900176bfd"}},{"ruleId":"D2","level":"warning","message":{"text":"syncChangelogToMaster.unreleasedEntries (cognitive 16): syncChangelogToMaster.unreleasedEntries has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 4 (6 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":"scripts-ts/src/syncChangelogToMaster.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0bdc8c4189ea7a8ce7fe2eefb7e0b3ba51ade324cb34d43333877acfd1ca0a0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VimChangeGroupBase: ClassTooLong \u2014 1477 significant lines (blank, comment-only and punctuation-only lines excluded), 97 methods. The bar is 400 significant lines; this is 1077 over it, 3.69\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"3779b5a9495b8ce0ca0423b768c8d93c44a20806e3dbc95c91a33295d683c7f3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimChangeGroupBase: TooManyMethods \u2014 97 methods. The bar is 30 methods; this is 67 over it, 3.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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"272daea9a5afc47fa235f0aea3a851f7a7eac542bc37e1e0948d7c55c8db0294"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VimSearchHelperBase: ClassTooLong \u2014 1255 significant lines (blank, comment-only and punctuation-only lines excluded), 68 methods. The bar is 400 significant lines; this is 855 over it, 3.14\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb05ae8764f9b1b835a21f71e925719508e8bbefbb7da42c0a2df90acdae4324"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/VimChangeGroupBase.kt: FileTooLong \u2014 1529 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: VimChangeGroupBase (63-2593). The bar is 500 significant lines; this is 1029 over it, 3.06\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f02f18b336e206679a745cd33e38220754a73d6f6016fee819db6cfb701499a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: IjVimEditor: TooManyMethods \u2014 79 methods. The bar is 30 methods; this is 49 over it, 2.63\u00D7 the bar. Most of these members implement api.VimEditor (61 of 79 members), so moving them onto a smaller type would remove them from that contract rather than reduce it. To reduce it, split the contract instead: give each cohesive group of operations its own smaller interface and its own implementing type. Where the contract has to stay whole, move the work behind these members into collaborator types, so what is left here is a forward per member rather than a responsibility per member."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjVimEditor.kt"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"945244f9039dc7c4bf1cc009089718b8aa6164b8e4005bf279fa82c812dd78f3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PatternVisitor: TooManyMethods \u2014 78 methods. The bar is 30 methods; this is 48 over it, 2.60\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c3de6839d2ef9ffde07350c2b2b2791d44bfbc41250808d2f581eb5347d7cae"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/VimSearchHelperBase.kt: FileTooLong \u2014 1277 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: VimSearchHelperBase (35-2050). The bar is 500 significant lines; this is 777 over it, 2.55\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe10962f2ac78c109437e75c546bd117613138acd45639bda7105f3df5c85c4d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VimSearchGroupBase: ClassTooLong \u2014 1015 significant lines (blank, comment-only and punctuation-only lines excluded), 43 methods. The bar is 400 significant lines; this is 615 over it, 2.54\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0f2370b3b9cbc43c8125f6e2c784fa3c198fc5df92e3445efa90e9a33462650"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimSearchHelperBase: TooManyMethods \u2014 68 methods. The bar is 30 methods; this is 38 over it, 2.27\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"96602621190a178a34db8cbda0d66099a9a0d6ddb6a481ec7875c6a4b4b03572"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/VimSearchGroupBase.kt: FileTooLong \u2014 1052 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: VimSearchGroupBase (56-1632). The bar is 500 significant lines; this is 552 over it, 2.10\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdf2d17a7220b8b8c7621cbb09ff42495468699134bce36569afdf995c96ec09"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimEditorWrapper: TooManyMethods \u2014 59 methods. The bar is 30 methods; this is 29 over it, 1.97\u00D7 the bar. Most of these members implement api.VimEditor (56 of 59 members), so moving them onto a smaller type would remove them from that contract rather than reduce it. To reduce it, split the contract instead: give each cohesive group of operations its own smaller interface and its own implementing type. Where the contract has to stay whole, move the work behind these members into collaborator types, so what is left here is a forward per member rather than a responsibility per member."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/VimRegex.kt"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"f397cfceb322afb17d843cf29964facde0306ffcfd220779592d62267523fae5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: EditorHelper: TooManyMethods \u2014 57 methods. The bar is 30 methods; this is 27 over it, 1.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":"src/main/java/com/maddyhome/idea/vim/helper/EditorHelper.kt"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"87db0753e9b39a7946b684e0d5e0c9855ff09f93dbd25b279e9a8eeba3111bdf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MappingScopeImpl: TooManyMethods \u2014 52 methods. The bar is 30 methods; this is 22 over it, 1.73\u00D7 the bar. Most of these members implement scopes.MappingScope (32 of 35 members), so moving them onto a smaller type would remove them from that contract rather than reduce it. To reduce it, split the contract instead: give each cohesive group of operations its own smaller interface and its own implementing type. Where the contract has to stay whole, move the work behind these members into collaborator types, so what is left here is a forward per member rather than a responsibility per member."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/MappingScopeImpl.kt"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"fee79a9d86fed81c129ce4d66fb6680d40461b22dd658e4aa20ef996cbc1f708"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimMarkServiceBase: TooManyMethods \u2014 48 methods. The bar is 30 methods; this is 18 over it, 1.60\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMarkServiceBase.kt"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"2027957110f8ee850fda4265cf45b6e058919b8eda923f52e3287a1a787ecea2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ExEntryPanel: 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":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEntryPanel.kt"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"80dbfee4289072effacc1a8d4b5184d3fb157d92437af1319344374d10f5c807"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimPlugin: 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":"src/main/java/com/maddyhome/idea/vim/VimPlugin.java"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b27ae645e5affa66b2661407413d61eb5ec9c06b5b4b4b899462a1f71baad0a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: listener/VimListenerManager.kt: FileTooLong \u2014 731 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 231 over it, 1.46\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52131872d4ce2b13ab173f842f68434a0a3031af9980e82a88b16d41098ca040"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimSearchGroupBase: TooManyMethods \u2014 43 methods. The bar is 30 methods; this is 13 over it, 1.43\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"2014ece3a0f230ac98c689b01aab50199fef99ed2868a46e20c7b22a265b4044"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimRegisterGroupBase: TooManyMethods \u2014 43 methods. The bar is 30 methods; this is 13 over it, 1.43\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"2255896ebf7ebe23e2d9ac37d71d2e59f33f978686fb472a2c3b6860ffbdba59"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: VimStringParserBase.parseVimScriptString: MethodTooLong \u2014 parseVimScriptString runs 141 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 41 over it, 1.41\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParserBase.kt"},"region":{"startLine":317}}}],"partialFingerprints":{"codehealthFindingId/v1":"833df2776ca1bb662bb881aa0e4e0f61d8eced3377b3e625da897b0e1932e4d2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: OutputPanel: TooManyMethods \u2014 42 methods. The bar is 30 methods; this is 12 over it, 1.40\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab5d6cc461a9732120544f3be246867af12da20274805f925ef3e9f711b016b8"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: VimSearchGroupBase.parseSubstituteCommand: MethodTooLong \u2014 parseSubstituteCommand runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1186}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fc018fc65b85817f6812e17e8a1fbceffe8258aca164c8530f343290a98196d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: api/VimOptionGroupBase.kt: FileTooLong \u2014 657 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 157 over it, 1.31\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimOptionGroupBase.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af486fc59f3d7fd1fbca040f93ff806131eec9bdf60207e0673b503fd29b33bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: group/OptionGroup.kt: FileTooLong \u2014 616 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 116 over it, 1.23\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bb15d4c52a70d8092a3c163e58b647bbe44f6f898e3ae075700683ff5558630"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VimStringParserBase: ClassTooLong \u2014 484 significant lines (blank, comment-only and punctuation-only lines excluded), 22 methods. The bar is 400 significant lines; this is 84 over it, 1.21\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParserBase.kt"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"66d773e0fa27e7e78b221791b42ec84e5a262d9154569b628efeac46e390a04a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: OutputPanel: ClassTooLong \u2014 476 significant lines (blank, comment-only and punctuation-only lines excluded), 42 methods. The bar is 400 significant lines; this is 76 over it, 1.19\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"2835b49f399d454cbee262e657c066024e50909c36c157fc83ee33c2e3ada798"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/OutputPanel.kt: FileTooLong \u2014 576 significant lines (blank, comment-only and punctuation-only lines excluded), about 83% of them inside a single declaration: OutputPanel (90-930). The bar is 500 significant lines; this is 76 over it, 1.15\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b635b66a3e91755f9beddd79eca55e845f3fa6dd561ef26fb4cd46afe1a97f19"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimMotionGroupBase: 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e137e2315852694f96b00a240de0a39cf8fc65f40ebbd12e29b95e91b8c5d1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Companion.createPanel: MethodTooLong \u2014 createPanel runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/ModeWidgetPopup.kt"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"f61a2c034d3bcc65c8d1f15c67290b01ad34894cd296988bcade49f2e6af7a54"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: selectTicketForAnalysis.main: FunctionTooLong \u2014 main runs 112 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 12 over it, 1.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/selectTicketForAnalysis.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f43f5714593ff1cdf7bb1c549c63b03ac4e7d95b62bdeb0fad26231c85fc551"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TargetsExtension: ClassTooLong \u2014 447 significant lines (blank, comment-only and punctuation-only lines excluded), 4 methods. The bar is 400 significant lines; this is 47 over it, 1.12\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/targets/TargetsExtension.kt"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff2a9c93256d09c5e3b1705af74e4320821c983181cf4843739b75d8f5505ea"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VimMarkServiceBase: ClassTooLong \u2014 444 significant lines (blank, comment-only and punctuation-only lines excluded), 48 methods. The bar is 400 significant lines; this is 44 over it, 1.11\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMarkServiceBase.kt"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"b770b82fbdc6e66feb3499b17e2fca4399f7b1ed4573adec4ea614e7c247d87e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CaretReadImpl: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\u00D7 the bar. Most of these members implement caret.CaretRead (30 of 32 members), so moving them onto a smaller type would remove them from that contract rather than reduce it. To reduce it, split the contract instead: give each cohesive group of operations its own smaller interface and its own implementing type. Where the contract has to stay whole, move the work behind these members into collaborator types, so what is left here is a forward per member rather than a responsibility per member."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/caret/CaretReadImpl.kt"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"babe706aa2c797ea3917180c23ead6070b5dd80c2ef7a18ce1ba41a9e7830606"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ExEntryPanel: ClassTooLong \u2014 435 significant lines (blank, comment-only and punctuation-only lines excluded), 46 methods. The bar is 400 significant lines; this is 35 over it, 1.09\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":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEntryPanel.kt"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"df5dd20e8cf3d742de0f688c351edf400c3490e8c6fad0180f3e49d0aa17fc4c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DigraphSequence.processKey: MethodTooLong \u2014 processKey runs 107 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"09a2b01c9477a864d52f0e2e58056c9e86b76bff2fab1740b78dac8c57cd48f4"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: VimVariableServiceBase: 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/services/VimVariableServiceBase.kt"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06a9b108238afa93aa1077d0c23eb3761e424d6c6f4f8a563e0b566b48bdd5c"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VimRegex: ClassTooLong \u2014 420 significant lines (blank, comment-only and punctuation-only lines excluded), 26 methods. The bar is 400 significant lines; this is 20 over it, 1.05\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/VimRegex.kt"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"13f5aa57dc6ba1258f5245d881c646bfb3fb2e4654a09875150446a434843ad6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: EditorGroup: 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":"src/main/java/com/maddyhome/idea/vim/group/EditorGroup.java"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"59419a69cd013472ec630738ed36945e33ac5272e6514a0aed612918441ef917"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VimPutBase: ClassTooLong \u2014 408 significant lines (blank, comment-only and punctuation-only lines excluded), 17 methods. The bar is 400 significant lines; this is 8 over it, 1.02\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d568bffc459cb113677140c6798bf8bc385c5e5a77401ef5a85cf5eeef86693"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: VimMotionGroupBase: ClassTooLong \u2014 406 significant lines (blank, comment-only and punctuation-only lines excluded), 34 methods. The bar is 400 significant lines; this is 6 over it, 1.02\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"c91ed9580ea2b91ba26aca7f9ac98c340dac2a46f3ab1621b71e8ed0306f044f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt:84-101 | src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt:147-164 \u2014 both copies are in the same file, so extract the block 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 \u0060src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt:84\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":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0a0dd746726173d0cf5b8eea4650c68d8b6fbb648f62b44bdc46f1aab48fac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:63-80 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:110-127 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:63\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, \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:82\u0060 calls \u0060TODO\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:128\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"28cec6bac9c2d8c1532bad9ac472010dd50fe14e79a42bcea8415fa4e2b182db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): scripts/src/main/kotlin/scripts/help/generateHelp.kt:213-229 | src/main/java/com/maddyhome/idea/vim/vimscript/model/commands/HelpCommand.kt:118-134 \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 \u0060scripts/src/main/kotlin/scripts/help/generateHelp.kt:213\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/src/main/kotlin/scripts/help/generateHelp.kt"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e2748824d847988c267597d588e8c079ca2a9cd87ead1c4fd82ec6fabdaaef3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimKeyGroupBase.kt:94-110 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimKeyGroupBase.kt:121-137 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimKeyGroupBase.kt:94\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimKeyGroupBase.kt"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"c77e90492e40b8dcaded290c8ad5e25dcd686b2c221728585e5c38a411553e12"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:42-57 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/WhileLoop.kt:32-47 \u2014 before extracting anything, compare \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/WhileLoop.kt\u0060 as WHOLE FILES: 90% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 2 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:42\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"389e4073a6f9a854a5b95cb73f64a5a20bba4c312911cbe43b47fb1792b90c04"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt:959-973 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt:1005-1019 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt:959\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. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":959}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b465146aab0088b2dbb323a98cc52d1a5848e65be2b604c8dbd7d7adbcce6b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 4): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:41-52 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:62-74 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:109-121 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/WhileLoop.kt:31-42 \u2014 before extracting anything, compare \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/WhileLoop.kt\u0060 as WHOLE FILES: 90% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 2 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt:41\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"742a4bbd0c5bbd2092b3604c3fcf8f904591ea57b983f31e99b8343a8bff9afa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/EditFileCommand.kt:45-55 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FindFileCommand.kt:38-50 \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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/EditFileCommand.kt:45\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/EditFileCommand.kt"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e7603dc1a4b5de0c04cf4a875156bd409bc2ddd0bc583a4640bb7e35f774a7d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/StringUtil.kt:45-56 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/StringUtil.kt:74-85 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/StringUtil.kt:45\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. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/StringUtil.kt"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f39bfbbc5a0df697284a93ba797cdf0837527237405def82114c24c277d4ee8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapCommand.kt:204-215 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/ParseMapCommandArguments.kt:73-84 \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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapCommand.kt:204\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapCommand.kt"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5e70eb076e87e620d859dcb2e4806b0a776509434f8c43aaaec2bf207eb8bb1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt:85-94 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt:89-99 \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. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"a65045a1c10dabd247d76a3983691a5b3045edfc204286182154823d0cf40978"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualAction.kt:36-46 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualLinesAction.kt:46-56 \u2014 before extracting anything, compare \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualAction.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualLinesAction.kt\u0060 as WHOLE FILES: 90% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 1 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualAction.kt"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"1221cd2e54987db07ecbc13b6c1c9810ded2463dd0ecf6438da34b53f37b011b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftDownAction.kt:36-46 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftUpAction.kt:36-46 \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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftDownAction.kt:36\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftDownAction.kt"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"60dbdd4321b3957d2a0a25180229e9f8f8f96c4b3d3e00d01d2278b0c7f319e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt:1099-1108 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt:1234-1244 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt:1099\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1099}}}],"partialFingerprints":{"codehealthFindingId/v1":"41090dd8ffd214600ce2bf55d89d0340eab3a09d3ed0e873beb1d4906dbe3f28"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/action/editor/VimEditorActions.kt:53-62 | src/main/java/com/maddyhome/idea/vim/action/editor/VimEditorActions.kt:111-120 \u2014 both copies are in the same file, so extract the block 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":"src/main/java/com/maddyhome/idea/vim/action/editor/VimEditorActions.kt"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"63f35aa694839e9e415c31683e953b9333d9cc8c1e9318222b7b07992efacc5c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/extension/classtextobj/ClassTextObjectHandler.kt:35-44 | src/main/java/com/maddyhome/idea/vim/extension/functextobj/FuncTextObjectHandler.kt:37-46 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/main/java/com/maddyhome/idea/vim/extension/classtextobj/ClassTextObjectHandler.kt:35\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":"src/main/java/com/maddyhome/idea/vim/extension/classtextobj/ClassTextObjectHandler.kt"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8176c51d2340b42735949e8aacbae9ec49b6041cc30aa7ca07204597074f479"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowLeftAction.kt:47-56 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowRightAction.kt:47-56 \u2014 before extracting anything, compare \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowLeftAction.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowRightAction.kt\u0060 as WHOLE FILES: 83% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 1 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowLeftAction.kt:47\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowLeftAction.kt"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f8b4a4ce37c05b615c2d5d54668cc1de473088a533ad8a15dfc58360f0addc7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/ExpressionVisitor.kt:439-448 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/ExpressionVisitor.kt:455-464 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/ExpressionVisitor.kt:439\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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/ExpressionVisitor.kt"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"c00caeb206e58c404bbaedb18f7941b64bd233d147e5f2eacb286941216be1ac"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastEndAction.kt:48-56 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastEndAction.kt:76-84 \u2014 both copies are in the same file, so extract the block 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastEndAction.kt"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"69bcaacf87d817b0eccf7c6d67e3308bb12a0afbf32b0a6498c8bbb080f1258c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt:210-218 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt:222-230 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt:210\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"d483a8fc6b8027b22c0fa4cf0205da4c8ef195fb634fa7d43279816fd99b3c75"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): scripts/src/main/kotlin/scripts/youtrack.kt:84-91 | scripts/src/main/kotlin/scripts/youtrack.kt:211-218 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060scripts/src/main/kotlin/scripts/youtrack.kt:84\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":"scripts/src/main/kotlin/scripts/youtrack.kt"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"60bc6107d9de0a6dc525624d554e6fec89310712a5ccceb05c6e5255be2d49e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesEndAction.kt:52-59 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesEndAction.kt:51-58 \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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesEndAction.kt"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"e090c5d764d00f2bb3a3035bb8d565cbbfd713fb5f83fd20c682adda1b21658c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt:949-956 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt:995-1002 \u2014 both copies are in the same file, so extract the block 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":949}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd8c6b8c3058fdc341da73a7bbc3653fbacb11c5a61fe7ca5af80f1da5db19a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapCommand.kt:226-233 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/ParseMapCommandArguments.kt:87-94 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapCommand.kt:226\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapCommand.kt"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e087f2818c8010dbfd2609db390dd6c35c5aa3393bdf77b59062335f02cd72c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/MotionActionHandler.kt:174-180 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/MotionActionHandler.kt:229-235 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/MotionActionHandler.kt:174\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/MotionActionHandler.kt"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9c41740485ea863542d60549cc92f4461232edf0c3c5bb4d84a97c89cb85075"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/options/Option.kt:316-321 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/options/Option.kt:329-335 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/options/Option.kt:316\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/options/Option.kt"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae4ad83eb626d21e75a4179621f7402d3f80bb9f467717186f15aa15c0f6a0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/extension/miniai/MiniAI.kt:62-67 | src/main/java/com/maddyhome/idea/vim/extension/miniai/MiniAI.kt:119-124 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/miniai/MiniAI.kt"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"711e988de4fa90d5f083171dfc017a487fd3ace3eaaec713d3f3a4f2428c1578"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt:194-198 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt:202-206 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt:194\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad1d3959d003ff3f8f3b8191e7a58827f509ea5bc479400160ab3aef3e041f08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/CommandVisitor.kt:236-240 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/CommandVisitor.kt:244-248 \u2014 both copies are in the same file, so extract the block 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/CommandVisitor.kt:236\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. The \u0060return\u0060 at the foot of the matched lines is the enclosing body\u0027s own terminal exit, not an early one: it moves with them unchanged, and each site calls the extracted unit from the position that \u0060return\u0060 occupied \u2014 no decision has to be handed back and re-acted on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/CommandVisitor.kt"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"0537c156843153b601e3e634e4264e96a16200029b8b766a0e0e19cca9849ec2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkAction.kt:41-70 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkAction.kt:41-99 \u2014 before extracting anything, compare \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkAction.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkAction.kt\u0060 as WHOLE FILES: 85% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 1 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkAction.kt:41\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkAction.kt"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f1ac32bb06cdac22080d8d9a85ac1885b0109c2cbc7295447fdf02b9c034d2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/extension/VimExtensionRegistrar.kt:94-98 | src/main/java/com/maddyhome/idea/vim/thinapi/IjExtensionLoader.kt:49-53 \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. 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":"src/main/java/com/maddyhome/idea/vim/extension/VimExtensionRegistrar.kt"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"27f352073e54a5ba84ed4f6e841e003652f1db38de00d27aeaaa03a5901aefc9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/extension/classtextobj/ClassTextObjectHandler.kt:46-54 | src/main/java/com/maddyhome/idea/vim/extension/functextobj/FuncTextObjectHandler.kt:48-56 \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":"src/main/java/com/maddyhome/idea/vim/extension/classtextobj/ClassTextObjectHandler.kt"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"5171cab19b5817e1744b11d3f96b2cb5f1befc0dbdb9314fee2a41dbd461b205"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertFilePathCompletionAction.kt:53-57 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertLineCompletionAction.kt:54-58 \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. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertFilePathCompletionAction.kt"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f328afc359955b1d0ea79efd283afb1be3fd9313fe5eb729a88cfdf938be4c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkLineAction.kt:65-70 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkLineAction.kt:41-46 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkLineAction.kt:64-69 \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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkLineAction.kt:65\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkLineAction.kt"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"9794cc0ad387794bcb592e33392c198160826353f8c4938788a0e2567dff2abe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt:40-47 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt:66-73 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupDownAction.kt:39-46 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupUpAction.kt:39-46 \u2014 before extracting anything, compare \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupDownAction.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupUpAction.kt\u0060 as WHOLE FILES: 86% of the shorter file\u0027s lines also appear in the other, so this reads as one file having been copied from the other rather than as a helper waiting to be extracted. The 1 duplicated block(s) this scan matched between them are fragments of that copy, not the extent of it \u2014 treat the file pair as the unit. 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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt:40\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"d99abb564d058c36b0d65875fcab3aaf7e8590949f1f74929e174d61b21d75d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt:567-575 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/StringUtil.kt:94-102 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1c5140ae33cabcb52dc22cb1d4b4550627de25de4447ce318729baeb907e550"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimDictionary.kt:118-122 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimList.kt:152-156 \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. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimDictionary.kt"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"e22ae36f3eceafc097530f10eb8af36c5b47c311d7eee702d4b8721fc3bfdbeb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt:208-216 | src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt:228-239 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt:208\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":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"faf817b37683d5f637071598b67b151fc4dfb78b478dba3e745eda478db33416"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): scripts/src/main/kotlin/scripts/youtrack.kt:64-75 | scripts/src/main/kotlin/scripts/youtrack.kt:192-202 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060scripts/src/main/kotlin/scripts/youtrack.kt:64\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":"scripts/src/main/kotlin/scripts/youtrack.kt"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"216dad18cbd230cc8f5ee92144dfe92bcf8bdd369253f0d3c98febc26aaa6ddd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/MaxFunctionHandler.kt:31-42 | vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/MinFunctionHandler.kt:31-42 \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 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/MaxFunctionHandler.kt:31\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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/MaxFunctionHandler.kt"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"1683b2ea8ffc2d2e60ca5b406029f7694234fe2ba57a8710dfe0eabc390e56ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt:735-741 | src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt:767-773 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt"},"region":{"startLine":735}}}],"partialFingerprints":{"codehealthFindingId/v1":"4489b08285b3361a937c89cfe0a66ac105b2cb9fa8b45944db154f0828b1b6ee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt:20-24 | src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt:104-108 \u2014 both copies are in the same file, so extract the block 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 \u0060src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt:20\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":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"267e9da9041717b7a3de78d0dca3e55d1146c965e9372275ad38f726258e63c4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java:57-62 | src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java:198-203 \u2014 both copies are in the same file, so extract the block 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 \u0060src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java:57\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":"src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"2427b83c8c755b434330a127840875aab32bb2918656536323c0dbf0b577eec1"}},{"ruleId":"D5","level":"error","message":{"text":"Circular dependency: :ideavim-acejump \u2192 IdeaVIM \u2192 :ideavim-acejump (one cycle inside a mutually-dependent group of 9 modules)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1299da550bfa96bf56ad3c6284c4087cd89d6204038c71b951c118680b0bb9c6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: VimMotionGroupBase (LCOM4 14): VimMotionGroupBase\u0027s methods fall into 14 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 14 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd986a0bd1947b71ef7b1e59c6c594d3c23bcceadf4b2ca88e8862fdd7269ae6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: VimSettingsPanel (LCOM4 6): VimSettingsPanel\u0027s methods fall into 6 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 6 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":"src/main/java/com/maddyhome/idea/vim/ui/VimEmulationConfigurable.kt"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"161305568ecfd0fb9feeb57bde94b46157c1a01104ce52873100dee4782593c1"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: VimChangeGroupBase (LCOM4 5): VimChangeGroupBase\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc2182525d067edc7b28101a0d36051196b90011905dbd316a0ee55672809d84"}},{"ruleId":"D8","level":"warning","message":{"text":"Coverage not measured \u2014 JavaScript/TypeScript suite: Coverage NOT MEASURED: the JavaScript/TypeScript half could not be measured \u2014 scripts-ts/ runs vitest but declares no coverage provider, so the suite can run and still produce no lcov \u2014 add \u0060@vitest/coverage-v8\u0060 (or \u0060@vitest/coverage-istanbul\u0060) as a devDependency. Coverage is excluded from the score rather than counted as a near-zero. The named suite step is one the repository\u0027s maintainers can perform; once it passes, the real number is measured on the next scan. Alternatively, commit the lcov/Cobertura report your CI produces and it is read without a re-run."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"62e63e619c28f057e129f2997c965d32a457366a9ce18ca019ffb6bdfba85c99"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 58 in VimSearchGroupBase.parseSubstituteCommand at line 1186. 2 of those changes were fix/bug commits, and the other 2 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-25..2026-10-23, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-25 11:11:46 \u002B02:00\u0027 --until=\u00272026-10-23 11:11:46 \u002B02:00\u0027 --full-history --no-merges -- vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1186}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1a7629c6ee0787bba3ee0068c087c5108db66eec4c59a0f07a336ee40ef5f3d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in VimMotionGroupBase.getMotionRange at line 432. 3 of those changes were fix/bug commits, and the other 3 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-25..2026-10-23, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-25 11:11:46 \u002B02:00\u0027 --until=\u00272026-10-23 11:11:46 \u002B02:00\u0027 --full-history --no-merges -- vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"88dfc875f08b65d18e230549f6c80cb88da53ed9b0ea4372eefb25559e49196e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in VimRegisterGroupBase.storeTextInternal at line 174. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-25..2026-10-23, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-25 11:11:46 \u002B02:00\u0027 --until=\u00272026-10-23 11:11:46 \u002B02:00\u0027 --full-history --no-merges -- vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f446a4cc741afd24622e58b8319907fe2d38433fa0716a09a75634e34f8ca1f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/main/java/com/maddyhome/idea/vim/helper/SearchHighlightsHelper.kt: src/main/java/com/maddyhome/idea/vim/helper/SearchHighlightsHelper.kt changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in SearchHighlightsHelperKt.updateSearchHighlights at line 123. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-25..2026-10-23, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-25 11:11:46 \u002B02:00\u0027 --until=\u00272026-10-23 11:11:46 \u002B02:00\u0027 --full-history --no-merges -- src/main/java/com/maddyhome/idea/vim/helper/SearchHighlightsHelper.kt\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/SearchHighlightsHelper.kt"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"2998373b556392dae5b149609bab9a7ef6f3ef35f155cd299b0a24cca4fdc1fb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FunctionCommand.kt: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FunctionCommand.kt changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in FunctionCommand.processCommand at line 106. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-25..2026-10-23, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-25 11:11:46 \u002B02:00\u0027 --until=\u00272026-10-23 11:11:46 \u002B02:00\u0027 --full-history --no-merges -- vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FunctionCommand.kt\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FunctionCommand.kt"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e6faf1cf0b8cee7fd1a69e3685329ebe73ea8ecd68f7682968de0be236c1ee"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/main/java/com/maddyhome/idea/vim/listener/IdeaSpecifics.kt: src/main/java/com/maddyhome/idea/vim/listener/IdeaSpecifics.kt changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in VimActionListener.beforeActionPerformed at line 101. 1 of those changes was a fix/bug commit, and the other 3 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-07-25..2026-10-23, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-25 11:11:46 \u002B02:00\u0027 --until=\u00272026-10-23 11:11:46 \u002B02:00\u0027 --full-history --no-merges -- src/main/java/com/maddyhome/idea/vim/listener/IdeaSpecifics.kt\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/IdeaSpecifics.kt"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"f66d8e83b5dad1af5dab50edf023bda0dad2c688a658c24bd3768d441452a68b"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 55 significant file(s) lose their only recent owner: src/main/java/com/maddyhome/idea/vim/extension/targets/TargetsExtension.kt, scripts-ts/src/propertyTestFailures.ts, src/main/java/com/maddyhome/idea/vim/extension/camelcasemotion/CamelCaseMotion.kt, scripts-ts/src/buildWhatsNewSite.ts, src/main/java/com/maddyhome/idea/vim/extension/signature/SignatureExtension.kt, src/main/java/com/maddyhome/idea/vim/extension/abolish/AbolishExtension.kt, src/main/java/com/maddyhome/idea/vim/extension/indentwise/IndentWiseExtension.kt, scripts-ts/src/collectPropertyTestFailures.ts (\u002B47 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"08d8918fc8f25b41ac4e485360011925733f73e1ee81ad8080675511f39a3725"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 31 significant file(s) lose their only recent owner: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetCommand.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimFuncref.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimDataType.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/FunctionHandler.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/MapFunctionHandlers.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/KeyMapping.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/LetCommand.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/operators/AssignmentOperator.kt (\u002B23 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"730bd8e1544938fe52674b9e958ac3d10532a7fa4d4425b3fc6d67b557090165"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #3: If anonymized user #3 becomes unavailable, 10 significant file(s) lose their only recent owner: src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt, api/src/main/kotlin/com/intellij/vim/api/VimApi.kt, api/src/main/kotlin/com/intellij/vim/api/scopes/mappingPluginExtensions.kt, scripts-ts/src/updateAuthors.ts, scripts/src/main/kotlin/scripts/youtrack.kt, scripts-ts/src/selectTicketForAnalysis.ts, api/src/main/kotlin/com/intellij/vim/api/scopes/TextObjectScope.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionQuoteAction.kt (\u002B2 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"999de3c226c5f75cc7080178334531471a6a7ab38d18796a43a9e28aebda8962"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #4: If anonymized user #4 becomes unavailable, 6 significant file(s) lose their only recent owner: src/main/java/com/maddyhome/idea/vim/helper/SearchHighlights.kt, src/main/java/com/maddyhome/idea/vim/action/OutsideEditorKeyDispatcher.kt, src/main/java/com/maddyhome/idea/vim/newapi/PrimarySelectionWriter.kt, ideavim-backend/src/main/java/com/maddyhome/idea/vim/group/format/FormatRemoteApiImpl.kt, src/main/java/com/maddyhome/idea/vim/vimscript/model/commands/HelpCommand.kt, src/main/java/com/maddyhome/idea/vim/EventFacade.java. Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cfdbf89aab588fbaf2acf8f201659493d575e8771fbffda560c949073a590df7"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 2 other contributor(s) are each the sole owner of a small amount of code below the off-boarding threshold \u2014 folded into the bus-factor score and metrics (108 single-owned of 521 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 521 of the 1359 production source files in this repository met that bar). They are anonymized user #5 (2 file(s)), anonymized user #6 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above. The files folded here: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/visual/VimSelection.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/visual/VisualOperation.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/CollectionElementVisitor.kt."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO support numpad keys parsing, see :keycodes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"annotation-processors/src/main/kotlin/com/intellij/vim/annotations/CommandOrMotion.kt"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"eebef8711a4c35a0ea0708b3ecc99c989ebf5c9a966d0105f2ff1bc85a781f89"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo inspection that annotation is properly used on proper classes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"annotation-processors/src/main/kotlin/com/intellij/vim/processors/VimscriptFunctionProcessor.kt"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd294cee93f2c6cb2d36a96bbc27bdbf92e61cb33948d0bf62f0876947d51525"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Vim will use whatever text has already been written to stdout \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-backend/src/main/java/com/maddyhome/idea/vim/group/process/ProcessGroup.kt"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"715248123037efb52c8a28eab9900f59ee445af36ded8fad5e72a9d1b3ee2521"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Confirm context in CWM scenario \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/PyNotebooksCloseWorkaround.kt"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"1302386a9b36452e60332180aa5ed493c89bbe487e3554baeb195096fcdbe0ee"}},{"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":"src/main/java/com/maddyhome/idea/vim/PluginStartup.kt"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"087f282a423ebe522f949cec9520106fbab50af294b3f90b78cd4302f38dc702"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider moving this before evaluating ideavimrc, so we can react to users changing settings \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/IjVimPluginActivator.kt"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"d91276da9d8f81df8519e987930e5ac830ff812bee30a56d2a98cccf33b46ca7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should this also ignore Tab in Normal mode? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/action/VimShortcutKeyAction.kt"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aef614bd47b975166201ed497310b006f3c4ce9e641bfd52900529aea4bb80a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/action/change/OperatorAction.kt"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"d746e05a518f571160e3c9ae9d64481dafb5fcff441b4ad83b26837d93aa656a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/commentary/CommentaryExtension.kt"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"b62b4d31e8be2ee27377e3ea0e1e3699b0ceded869fea2080ccef70385b2e273"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"abdf34edb862788432c4f053b511d19a99fbc21f4974feeb78a4e9fd30bac14f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b9598a64006af4cefd96376618dc601ad820d961fed55cdf5cbb8a63c47a482"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAtPreviousInsertAction.kt"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"e394e18cf676979060fdd58f4a05e446813ccb99c7bc89fed210586f352da5d9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SortCommand.kt"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"7faabc9e086532f007c2a979d11fc66bf8a9b2a3731c75a4d61cb4835b8e435f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/MarkCommand.kt"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd9d502dee80380b75c7ab6fcd50101653887e64dc81ff838feb91aac24cfdc5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/cursorFunctions/ColLineFunctionHandler.kt"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"651633a895017bacfeaf6f53cc227eb75c41a102c0abdfaefc0d9a8acbd1cdc2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this method should use IdeaVim methods to determine if the current position is in the string \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/argtextobj/VimArgTextObjExtension.kt"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed5b1bb5ed05651a2b5a7782754aa133c734328db10a48e126d2f3475a061f1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: handle other modes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8acd4f7bbb5fd1ac1cddea4fd8306056f0f4856b6a255b5a2883b8b2c0465de"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO handle: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a0d5aec49af32fe1897da09528b5a903de38b1239b983c70ad4e2f5bb9eb37"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: handle: if ident \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08fac0b8e9bbd8329e0711e16901190c455aab3127a10162e66f54fcc7be381"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: improve KeyStroke list to sting conversion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bed80e2152e79e29416e2819334016c43ede718dc4e725b710444c5dc8f71b5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: handle \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/exchange/VimExchangeExtension.kt"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"60ff40a6ce04db1e88a18b6980ebe557fc8d281b8092d5f00b9dcc00dd0d881b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: IdeaVim should help with lifecycle management here - VIM-3419"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/highlightedyank/VimHighlightedYank.kt"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"3444b827a42eb8cdade5dd0e16381410cdd117d1524b9e4b32bd8ff449c7863b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO remove ex-commands \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a203d858222b998b1d0072adeb0831428a357f60dcb2ae4046aaed7413f4433"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: 22.01.2021 Doesn\u0027t work correct \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d1adb8cdab3bbac54d1de33d291d5e9c90243f9f53ee1c38ac2834c7ffbc73"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: 22.01.2021 Doesn\u0027t work correct \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"614b1c448db6ecee5bb36c983080939c99c547de8eb9b8f19d6ab91f9ede60ac"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 21.01.2021 Should open in left split \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"3230985210f95a1f8268c191006e6befc888a61e3534ea47962c2f2fd799f46a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 21.01.2021 Should open in above split \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/NerdTree.kt"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac5aedfe1912d3748d60b103d91c57ae22c395c371a46dc64de48c148fefa017"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO support going [count] lines upward/downward or to line [count] \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/Mappings.kt"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"690de5f2b7c47b92160c705c5e86af065c4531017aebdb7117f2880c82f3ed97"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME lazy loaded tree nodes are not expanded \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/Mappings.kt"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"87301b2cf7feabddb1ff24105f711705d94f24a38b161d2f50d708979c0f45e2"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME We should avoid relying on \u0060ide.tree.collapse.recursively\u0060 since it closes visible paths only \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/nerdtree/Mappings.kt"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd981d5b917440cb596e082487e047f8e02b8ebdef5dad4164f95263fdfa2df6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should probably be handled by ToHandlerMapping.execute \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/surround/VimSurroundExtension.kt"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"dba6289fb54f7b5e30d24d7c17c9da7f402683ad469367096b14ffce516107d3"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX: Will it work with line-wise or block-wise selections? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/surround/VimSurroundExtension.kt"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80f6ad887b93a09c790f98cc0ebf6f7dba9b92ec7ba787a1b1c2d4542bc1928"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Get rid of this custom line converter once we support soft wraps properly \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/EditorGroup.java"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"26c0ca15850a2fbfc39761243b930dcab897adf3483d2f1b173a08f6d5886ac8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo save jumps after IDE close \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/VimMarkServiceImpl.kt"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"771e9c8af5b98038dfa7c9dc23cc47842064dfce86ffec377b992052fa7c5e59"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo sync vim jumps with ide jumps \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/VimMarkServiceImpl.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"03fa846dc8acf06a1dfc86c04ed705bdcafdbbc9f72071c350549fee405e110b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo exception after moving to global mark after deleting it via IDE (impossible to receive markChar) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/VimMarkServiceImpl.kt"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"db995be3a6fe43a9c908189df8f1cb52c6ce892c8a0be468f9bb4c04f6f706cb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Don\u0027t add columns to visual position. This includes inlays and folds \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/ScrollGroup.kt"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"3828aec5429a1680a5dfecc902b509eb4e0e0771b7a4a948dc76ea8b9e0c0766"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should the offset be applied to visual columns? This includes inline inlays and folds \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/ScrollGroup.kt"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"68bb5a7e55efbcf1855d1723fed7f0e0c91ee170bf28f40871d8a51d11c7e6e5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should the offset be applied to visual columns? This includes inline inlays and folds \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/ScrollGroup.kt"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bd5aac523e1aa09102d6cbaba0c03be46cf98ad8fbecea5e48b6f8105e1ee92"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should be reset whenever the window size changes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/ScrollGroup.kt"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"524132af2710b76b3e6d094aa1a1f549a302ccdadde545e558b67b6ee2b4fe62"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: If the IntelliJ setting is in practice global, should we reset local Vim values? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b6a3cd11f37d6384c73586df4baf9ca408ec6d44f268c4b225d333589c9cca2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: When would we not have a virtual file? (Other than the fallback window) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"d21e7f9aa36440205961b82bade68ace56aa77d8de7ab8b7ec519a5acc964578"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We could also implement \u0027breakindentopt\u0027, but only the shift:{n} component would be supportable \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"689313bd014355afde68c8522e293459d5e555a3876d7755bb470cd80f5f936c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support \u00B11, \u00B12, \u00B1n, etc. But this is difficult \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"2396ef540505f3f532e42a8f0d7f19e69eb52dfe3bc3d5d68de8c8cb4679098b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: When would virtual file be null? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt"},"region":{"startLine":622}}}],"partialFingerprints":{"codehealthFindingId/v1":"abb6e72a8e026ff6ed1229f475ae328b5424d0469afe67a2a6f77a08b4815407"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: If project is null (why would it be? Scratch files?) we could use LoadTextUtil.changeLineSeparators \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"607a1c469ed35d03efd4dc354ddee1f5b07d16e584efd2a01c792b105fd50d93"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Visual column arithmetic will be inaccurate as it include columns for inlays and folds \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d6c469ce07f0c08c29f37c8ace5d0c16ebc0cc12811a58cbb2210117f5d853"}},{"ruleId":"D17","level":"warning","message":{"text":"HackComment: // HACK: for Java classes and methods, we want to jump to the opening brace \u2014 a workaround marked in source: record what it is compensating for and what would allow its removal (the upstream fix, the API it is waiting on, the invariant it restores), so the next reader can judge whether it is still needed rather than rediscovering why it is there."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/PsiHelper.java"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"880b35a79ac0ae66952be81b77764ac1f19cbffda9612dbf02c892190805ee51"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Try to get rid of \u0060getText()\u0060 because it takes a lot of time to calculate the string \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/PsiHelper.java"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5785e254ae0f46c17abbed6a7ba36054454eadc7331ad0a42351b4ed94e8796"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Is this a per-caret setting? This data is non-transient, so could be lost during visual block motion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/UserDataManager.kt"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"a63cf3bac558b95cdeeb6cfe1c2b16be20aa4cb2ca41ee070809d0866badc28a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Data could be lost during visual block motion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/UserDataManager.kt"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab679c665ac2c63c16051046f6be951559a53fe04a5f0d2bc4c0cda17eb71c9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO refactor me after VIM-308 when restoring selection and caret movement will be ignored by undo"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ba72ed29cf60eee9f8ee0b7341449f2486d9430c0456a14c7a44513252755b7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO refactor me after VIM-308 when restoring selection and caret movement will be ignored by undo"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d5a2edde815c4c779f61105f9dedd7b7e0acdf8f2f94cd447f0f4f51569bb77"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO all the carets should be moved to their corresponding insertInfo.startOffset \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"83e6c7c557b959f215c4092a984d82e1c20cc0f6ebdf28f508e030f940f04dbc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Should be replaced with VimEditor.carets() \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/Helper.kt"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ca6163a015b2df3d43006be39f16cd2ad71763f5ba388f1563805254e7efdc9"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX: I\u0027ve disabled this check to find the stack trace where the project is disposed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/helper/Helper.kt"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"5762aabd2b701d071efb17c5a153ed83a7fc7a25076afe99a53b4467d6aaa35b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Why do we register listeners after evaluating ideavimrc? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"153f79f915689ef6ce86353c98e176dca499e965d5859f5010ff52f653fbafc5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: If the user changes the \u0027ideavimsupport\u0027 option, existing editors won\u0027t be initialised \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"123b329879895d5c74e7c4c9f8485bf6e943f16c8fac70258887510c35be7a4d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: It is very confusing that this logic is split between EditorSelectionHandler and EditorMouseHandler \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0d05671370ed698cee090791055b8c80728943c55ba35f6c2aacf61ea2e5c82"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Can we merge this with ComponentMouseListener to fully handle all mouse actions in one place? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":838}}}],"partialFingerprints":{"codehealthFindingId/v1":"91f9bb3dae7b95727678923b58655bc2a7b1d0ead00912bc0e8176ba302bc33e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Can we merge this with ComponentMouseListener to fully handle all mouse actions in one place? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":1069}}}],"partialFingerprints":{"codehealthFindingId/v1":"716b44036c7ce81ada2a843f9d1fd4089b0aaf71238dfb149deefe547f3bec78"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should only be for \u0027selection\u0027=inclusive \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c5d50f8a9e570bb5daf7c83232f7b2ed54cd5814a9c1f39e41a9b28c41d500a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Modify this to support \u0027selection\u0027 set to \u0022exclusive\u0022 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt"},"region":{"startLine":1112}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcd775274a1dc49a50104ea1ef02adf2189b3dabacc5ca6c1183e127823e8c7e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO add it to PsiService \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjVimSearchHelper.kt"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c6ce0bb7c29f474eca6da74b6ab70c135f585d954e726a14a8d6034312993b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO add it to PsiService \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjVimSearchHelper.kt"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3e97a70d4be1712a7e6583875ca63fe1b8715d97e8d0fc64e7aaaaaea36e911"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO add it to PsiService \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjVimSearchHelper.kt"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"137cc95ccd36a3284fc45b505764343356a4a285f5cc0971de3471e98453de08"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 30.12.2021 Is end offset inclusive? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjVimEditor.kt"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"b27dae6839d4cb532ad72c65ab19ba6f29025daf65d1520bd1af491ec55349be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 30.12.2021 getLineEndOffset returns the same value for \u0022xyz\u0022 and \u0022xyz\\n\u0022 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjVimEditor.kt"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf9d48c723d6daa3a5584201b191cbf3cdf1e182299ed3d69bd986b0362fda9f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO prefer methods with ranges, because they collect and preprocess for us \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjClipboardManager.kt"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"34ea93953aacd5276375c8642be3b30d4f605e5476861f9f813da89de42bf4ea"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX: I believe the proper solution would be to get rid of this if branch and update the action when \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ReloadVimRc.kt"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"109dc41b1aa6f17b06101512fb22f33aa9fc37b919dcfb167c5477a97eb806e3"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX: Actually, it worth to add e.presentation.description, but it doesn\u0027t work because of some reason \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ReloadVimRc.kt"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"164900aa6ec0d672ce754e7a17154b41262969d2442f46f12ef0382da20c8d5d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Document why this is invoked later \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/OutputPanel.kt"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f74ce80c393756e9df415547272f08b030e2c4c62b9912d5cc9db82b7b12a8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This is where we would handle right or centred aligned text, but we don\u0027t care about that \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ScrollingInlineCompositeView.kt"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a45f0f5511a42f1b482b5ee3769a5b1e8e722bb13940eeb6068368dc12a9f5"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX: The Ex entry panel is used only for UI here, its logic might be inappropriate for input() \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEntryPanelService.kt"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"068743227c48b53e99854907c00abcbf15ce9f8f2f1ce7e0fd9ca22b39c706f9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Reduce the amount of unnecessary work here \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEntryPanel.kt"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef5f81662ac7eb90c40af370130dbec75857dae5f227d436173eaa18a4914c13"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add smagic and snomagic here if/when the commands are supported \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEntryPanel.kt"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfee70b009bb840b00552a35cfbeaf983fd8d050bb86d361ee299ee0f7bbe109"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Introduce IdeaVim colour scheme for \u0022SpecialKey\u0022? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEntryPanel.kt"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"9742a9739c9fbf6663ca7e8ca0307b1992267a95e6f51353134ae6d14535833a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: At the moment recording macro \u0026 RegisterGroup is bound to application, so macro will be recorded even if we \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/widgets/macro/MacroWidgetFactory.kt"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"996f311d8af8bb015d93322cc7b4fd539393c45c1a31295bdea0124edaa3c78f"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: 01.11.2019 Nasty workaround because of problems in IJ platform \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/vimscript/model/options/helpers/IdeaRefactorModeHelper.kt"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"606490b374e2cf8d0f33964177b6c325f04af58b60e3bcf77fbaa05ce39eb7c0"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX: \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/CopyActionTest.kt"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"387598d26136497acace3b05fbee2437fd86e0dd6f85486417f9e333ceda18c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Review this test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/CopyActionTest.kt"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e3f73f156a3b9ba1ecf3d94a108c92307faf8ceff42ff198f2021c2c6172dd3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Review this test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/CopyActionTest.kt"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fcf0b17630fe5706d1530e62eed486d0022397da4f16d0e402149663d6a7d04"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Review this test \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/CopyActionTest.kt"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ddff45004b70e19a031518c0ad5ab1fb36f6c0a580d0801d3ab2dd6b47ea817"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: It\u0027s unclear that this is incorrect behaviour. Vim also fails with this command \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/change/OperatorActionTest.kt"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e5831d4a4a41361ff566f5ebfe2115c247688767ce00f9839e3f41c0bff6420"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //  todo test cursor position VIM-2732"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/change/change/InsertRegisterTest.kt"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"949eb41a01386b201a4047003031bb596eebfbf5bc10f087632e067ebdef5b2c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This works for tests, but not in real life. See VimShortcutKeyAction.isEnabled \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertTabActionTest.kt"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"27715edc56ece165030a4944c62b4602eb5cb8a34aa0bc15c25e308d3e5f1d91"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo parametrized \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/change/insert/InsertCompletedLiteralActionTest.kt"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"383aacab4e12c44e10431440ffc715976ae35367989047608c4ec68291e14f78"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/copy/YankVisualActionTest.kt"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"c585998d61f461cf15b385712f50f88e5723061f86be2138e0ae33f20b4e6ee4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Why does word match this, but WORD does not?! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertWordUnderCaretActionTest.kt"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"426118389b0d696e9cb57cce1971f6c0c401c882157d6951bd2bebf3bf9b506d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add test for not applying abbreviations, once we support abbreviations \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertRegisterLiterallyActionTest.kt"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"a781570d83dfa5a48ecca0c6fd8daf124f768abb8b84757d36302fa48f6311a6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add test for not applying abbreviations, once we support abbreviations \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertRegisterActionTest.kt"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cbf26b07c221d0456ef40c616fece7d98d50ea885e76bdbe200f727a5a5d296"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add test to ensure command line completion is not triggered, once we support completion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertRegisterLiterallyActionTest.kt"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"97071f8a42c1f4fb327e846e70e7f16b3cf7b6b14934b4da0bcb25aee3892bf9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add test to ensure command line completion is not triggered, once we support completion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertRegisterActionTest.kt"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f4f4aae6418cd199010976fd6962d165f5d0410025d48a7692e291950d89131"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This doesn\u0027t work. DigraphSequence converts \u003CC-V\u003E\u003CC-J\u003E to \u0060\\0\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertRegisterLiterallyActionTest.kt"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dc5e3097defaaf41b8855296ed42676b632b97661ce05c5e0ffec5ef93a7fb7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This doesn\u0027t work. DigraphSequence converts \u003CC-V\u003E\u003CC-J\u003E to \u0060\\0\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertRegisterActionTest.kt"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5733df22fa6698a5ebd74654651541ec5bcb54e6941021ab21bee320a0c1f85"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Tests for filename register (\u0022%) and alternate buffer register (\u0022#) once supported \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertRegisterLiterallyActionTest.kt"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"a077cfbc28600485f501ef2deb29dc85a5f79b0c6aa777aae44cfa45c12707bc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Tests for filename register (\u0022%) and alternate buffer register (\u0022#) once supported \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertRegisterActionTest.kt"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"f834fede521ef050c4e06f473bb4a25577f7d764a8039bb85658e4d3b6b78776"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: IdeaVim handles \u003CC-C\u003E before handling digraphs/literals \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/ex/InsertLiteralActionTest.kt"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"33b066f4cd879c0139b0e1050b9a3fc3210ee6fbded8388173cf26318acc0d13"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should only be one \u003CC-Left\u003E to get the behaviour above \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/motion/select/motion/SelectMotionBigWordLeftActionTest.kt"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d5b6d81c4636313c609b22287f60db4397ee43fff63c539677b8750833e97ba"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should only be one \u003CC-Left\u003E to get the behaviour above \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/motion/select/motion/SelectMotionBigWordLeftActionTest.kt"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b456d1906043d71b9b2510806dde7c34f30a601a483bf0c556bc41462e6d0a8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Enforce virtual space \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/scroll/ScrollLineDownActionTest.kt"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"59dbc39cb3e8ed7bc014cedc05ce8f5e0a69f3b7ec50878dcda695dc98205e4e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should the offset include the visual column taken up by the inlay? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/action/scroll/ScrollLastScreenColumnActionTest.kt"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"c82643b81c951bb86517acc5b4732340645b131f29b567f8c1f0ea2e6822fef2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Investigate differences and reconcile \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/MultipleCaretsTest.kt"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"760118de1ec7a11fbab7f8f834e62b0596bec7779bdee815d4d4dc628d0948ea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo time limit \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/LongerScriptTest.kt"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"753155b0385dbc08706a3995e0982af9318b40400f376ed2b24c4f3404479fbf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo empty left range! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/SubstituteCommandTest.kt"},"region":{"startLine":686}}}],"partialFingerprints":{"codehealthFindingId/v1":"184fcb7b120e7dd2577831b23b24756de8daef12f71fe27f56973795937e92c4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We need a better way to handle output \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/PrintCommandTest.kt"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b82393a0f1ba4689baee908ccc8b16f8ddd71cd46bded815a608a5e1c249453d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support lmap \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/MapCommandTest.kt"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a24f8a4650dfef06b8587fea3be2b2b9772340a4e06e890dd984aa7cfd06eb2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //    enterCommand(\u0022lmap lang foo\u0022)   // TODO: Support lmap \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/MapCommandTest.kt"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8516fedfff4824e67e8b0f6894e89dec46bc867b080ef1190ee6c11a92001ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo keyPresses invoked inside a script should have access to the script context \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/MapCommandTest.kt"},"region":{"startLine":1086}}}],"partialFingerprints":{"codehealthFindingId/v1":"76ea5d3008ca4fa21cea35a25beecb64c3fbd564e496cc1f0fc3a1cf6cb30545"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Assign Funcref \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/commands/LetCommandVariableLValueTest.kt"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fcc6c89c6ac530ed5337152d13cdce09d28a1c41b7e1eb1d8444f3ec2043ea2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo. \u0060commandToKeys\u0060 is executed as if it would from the command line. so no script - no scope \u00AF\\_(\u30C4)_/\u00AF \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/AnonymousFunctionTest.kt"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"01c2aee659cdbc6f6b7779fe0b9e548d0457bf922918ec5951ef3e8779f8d3b0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support errors while calling functions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/collectionFunctions/MapNewFunctionTest.kt"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a54bbe555dd3d519b92b2c430b7ee32b790d5668058d37d817080eabe4e2ae0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support errors while calling functions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/collectionFunctions/MapFunctionTest.kt"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"f814186a48f3c5b3b032f236ea21dada179e59df0f419bf7adcce17f3a1ed5ab"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //    enterCommand(\u0022lockvar a.a\u0022) // TODO: Support this 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":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/collectionFunctions/ExtendNewFunctionTest.kt"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f0eb097ae9409745dcd94b1988790da2fe07a344b3415e897728ab462445173"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //    enterCommand(\u0022lockvar a.a\u0022) // TODO: Support this 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":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/collectionFunctions/ExtendFunctionTest.kt"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"34d0cf6a507b989c4331b70347e9cdeb18998e58ef6846079c6c9bc9b9b112db"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX virtualedit is not tested \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/cursorFunctions/ColFunctionTest.kt"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4ed7fbde136490d06c9d12d22f1d6f1a53fcee8fbc9e20cfc92e2c01cbd94fe"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Fix locking \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/listFunctions/InsertFunctionTest.kt"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b7649492f4b3d514f01c679687c16af1746405bc9aee1c713869b825019d60b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment repeated across 11 files: The identical TodoComment appears in 11 files (13 occurrences) \u2014 almost certainly one boilerplate line from a single migration or decision, not 13 independent debts. Fix the systemic cause once rather than file-by-file. Text: \u0022// TODO: IdeaVim should support abbreviations\u0022. Source code is not a task system: track the cleanup where tasks live. (Every occurrence still counts toward the score and metrics.)"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/mappingFunctions/MapSetFunctionTest.kt"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef87e155d921150f7e53822386d95b348b4e9a6aa59b4fd2abca128269a90e49"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: More options for map? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/mappingFunctions/MapArgFunctionTest.kt"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"59217bd03bc567b8ab6effcf720f4b7d82c53ef9d22142dc11674d6917241b60"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: lhsraw for special keys \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/mappingFunctions/MapArgFunctionTest.kt"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"c28f8e09ca3d79a9b83d8c2e814c2262df2d5b9c834c9075227677b34acefbeb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle recursive entries in List and Dictionary \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/stringFunctions/StringFunctionTest.kt"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"e444b5635239c011e3f119d97ef7b4cb7c9e948d3e1a5abff3aa604f2f2f4055"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo in release 1.9 (good example of multiple exceptions at once) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/varFunctions/FunctionTest.kt"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ac5767c9db55b12834e3dc7de8a213f947661555fa8650e3c672b19f96f7063"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo in 1.9: test for with different default scopes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/statements/ForTest.kt"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d10636875941653b1e704bb6cf5f7f4c17fb3f686267a0ffbd5c36f565d1b65"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: With proper parsing, I suspect this should be !(foo[\u0027name\u0027]) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ex/parser/expressions/PrecedenceTests.kt"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ff8d308fd58000f1e6525895f427ee0756cfd042d26e18d8240cd5f8467827"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement zf \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/group/motion/MotionGroup_ScrollCaretIntoViewVertically_Test.kt"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"81947d568c7e11e6b44ba1b9e5991b87df3d2acf6e8843a32970222f44145b94"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Select mode should use the same caret as Visual, based on the \u0027selection\u0027 option \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/helper/CaretVisualAttributesHelperTest.kt"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"48ff0d6475f1132b039bdaeb11d9df350957c8996ef448028aef2cc72b92a285"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 2019-06-18 VimOptionsTestCase \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/option/DigraphTest.kt"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a205b33d3095d3ec8825662a2ab4f9833f4ead2f9bc693437b76238a00448bb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: How to verify that escape does nothing here? Mapping? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ui/MessageAreaTest.kt"},"region":{"startLine":520}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3177416ecefcfcdf4cb2710fbf00dcfe885be23c51b5b4dc783d3974a51c904"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: How to verify that escape does nothing here? Mapping? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ui/MessageAreaTest.kt"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9f563f488f125dd6b4ac3496b87140a4957436152e4d8416c25ac2163ee5daa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Maybe force a specific font height for tests, then we could hard code page sizes? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/jetbrains/plugins/ideavim/ui/MessageAreaTest.kt"},"region":{"startLine":1293}}}],"partialFingerprints":{"codehealthFindingId/v1":"62dd3bddba8aa99643211d24111973026c7f3c586dfcbb548bd45e73ff8f03f2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 24.01.2021  mapping time should be only 1000 sec \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/java-tests/src/test/kotlin/org/jetbrains/plugins/ideavim/ex/implementation/commands/MapCommandJavaTest.kt"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"83d32336c8b563c40d58065bd557f02910ddec7f398828df8ba2d71583470206"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should we prevent this? How? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/java-tests/src/test/kotlin/org/jetbrains/plugins/ideavim/group/visual/TemplateTest.kt"},"region":{"startLine":1259}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9818c307d486ec3297fcd8db46f3e3c461a35a225d0d41b4e6962be419ba126"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 25.01.2021 Add neovim test integration \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/property-tests/src/test/kotlin/org/jetbrains/plugins/ideavim/propertybased/MapPropertyTest.kt"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"e622f2aba7592bd976872291fe66a546e700fde2cb8ab2c95485857c79f88786"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: I\u0027m not sure why we abandon plugin commands 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":"tests/property-tests/src/test/kotlin/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e9a74d23f33c4229b1e50a3489dfd652d616c38b4c44e2f5b19cac15ae40b70"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This is incorrect behaviour \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/property-tests/src/test/kotlin/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1b5d8fde660e515b2ef6b993c8b0d18b54ed18198a614418c3523b93d311c46"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Is this legal? Should we assert in this case? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/property-tests/src/test/kotlin/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"e486c8eebb1d3757b88bc4b4d73901e378f8a2de3b1193f7978cffa95a8a3a7d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO In the name of God, get rid of EX_STRING, FLAG_COMPLETE_EX and all the related staff \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"tests/property-tests/src/test/kotlin/org/jetbrains/plugins/ideavim/propertybased/samples/JavaText.kt"},"region":{"startLine":796}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba13ca1e341ecde80981e448fa8bada38a4906d806ed27be4a7e6849914fb509"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO for future refactorings (PRs are welcome) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/KeyHandler.kt"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"75f2d4b83d1f35cbab9444fdfdaacfc268f22ee8d99f9c05f26fa2189a02fe2e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO figure out a better solution \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/KeyHandler.kt"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6722445027a2286e70f43909baae1a2c37aaad56692519923131c671291004"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we should have a single reset method \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/KeyHandler.kt"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e3b8aa361f41a64721e0af424bf09b419c5fd818c30daa16d96280b69e040b5"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME I\u0027m a dirty hack to support recursion counter \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/KeyHandler.kt"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"697a42530eae3dd1dfe5c3af4f2ef8c4eb7e75dc433d7acf5816bf6a0cc619b7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Is this correct? Should we really use only current caret? We have a caret as an 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharacterAction.kt"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddbbd34b96c26912f355762ee0736632c77d585cd5e9eed96ae413ccf1da1c34"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO This behavior should be configured via the \u0060backspace\u0060 option \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeletePreviousWordAction.kt"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"84c06c6dc6d20718d1d4b542d82fd1eb968b405ba8e834489eb8485c7c9de371"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO support motions for commands \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/ex/ProcessExEntryActions.kt"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ed290af6b4c8c6bd6ad15c44b71aa92351059a5586f1a0fdf793971155d6d94"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO we have the same command but for NX modes \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.kt"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"3681ce27bd4118aff52aebe9b3b99c55f6fef4e2b3719d1bd5cd188e3a3e5f83"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Is there any way for IdeaVim to handle shift\u002BnumpadPlus? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageDownAction.kt"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"8201790ec679b037c88e1b29ea01ab5a8a858ee0d57dd3d688e6e0e74262e2cf"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: 2019-07-05 Workaround to make jump through methods work \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"bab1f9428019c7b8c9465db850c86a8b7c3537ad308b90ee1baf0fbaa6704b81"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: It would be nice to know _why_ we use native actions for Delete/Backspace \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectDeleteAction.kt"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dbe2e96ca8a5e2dda644fe3cb114569e0e59e5e4a58c87435e45ce441378942"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME I should not exist (see class above) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownFirstNonSpaceAction.kt"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"2db90481fb2f1aa205f60ef6147d1740df5b918a6be7c096f0b46db811bb2727"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: 2019-03-05 Make it multicaret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapSelectionsAction.kt"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24a65a59789694860e61663ec954b12ef129cb4be15bfb5167233531a5ce298"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Improve handling of this.exclusiveSelection \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimVisualMotionGroupBase.kt"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca3759429924a3b04e48d07688badfbb52cecedcb2f25721d8f9d868c535d3ea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo what is the difference between this one and com.maddyhome.idea.vim.helper.EngineStringHelper#toPrintableCharacters \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParserBase.kt"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"db59794c5fdf4f6c2fbee38d0f369a37ab6ddf73a6f4088f4995f826794581dc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo better name \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimStringParser.kt"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e922b99abaa149d928c58a40e0659ab25f0c10ffde8684182242554631517bf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo better name \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/VimLContext.kt"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f4cc83b0f2546aa44e207ccb12a2e452dbbb0b986a267817455c7d8e0979804"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo all this methods should return Long since editor.fileSize is long \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed7d77fe0ede627e9d162c92fb1b1c2d4fb822281681bae563668e6c727b2bb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo same for TextRange and motions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"39cdec365b003a22e6005682a8e0a8ed57e4a1005b187084541feff571390c1a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo someone please refactor this if you understand what is going on \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1537}}}],"partialFingerprints":{"codehealthFindingId/v1":"07705642515fc6d750410fe771ed13f5e879742562bafee7b141845dfb2eec74"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Remove this when IdeaVim supports selecting the new line character \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt"},"region":{"startLine":1840}}}],"partialFingerprints":{"codehealthFindingId/v1":"24d75d4a80582afefb79bea634242f9bc9db58d4041de365045b02244ba125ee"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: this can be made not open and private when SearchGroup.java is removed \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a8949c6dfb4cff14668159f7cbeb2f52156862d155dc60995ff7c1a54d824d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Delete this. Fix the mess that is the multiple entwined implementations of the search group \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bdaf0683cc40e9d2a905e85ce067330a924af49905706c09614dc8d87d5980b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO I think that this method (and the method above) should be part of the global command \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2e50db0659ada47e18cf28830d86e1cfa02cc806d5e1e95d7e154620f89a545"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider improving pattern offset handling \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f48c698dfa988a62ab7d8f37eff951c4cfa6a63f929df6f100f9e8a9e12c90a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support reporting number of changes (:help \u0027report\u0027) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":748}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7eb9de902965e82ce1082151f4eba05545db45ca4849f8ddef252ff7360bb6a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo throw multiple exceptions at once \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1005}}}],"partialFingerprints":{"codehealthFindingId/v1":"a84861e430b00de8e8224cb1b9e8c9edbaee113feccb3539926b369756066e34"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support printing last changed line, with options for line number/list format \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1309}}}],"partialFingerprints":{"codehealthFindingId/v1":"89592fbabbef38344c605f9bf2e9e9d7af73e0ef9b8a73a516fc389e60e78172"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: allow option to force (no)ignore case in a better 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchGroupBase.kt"},"region":{"startLine":1396}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbb471a9b0160a1bf9c8d4c9f9335bdd93c530e7aaaf988e407628757804ca6e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This is incorrect. The correct API to add a function is storeFunction, and we shouldn\u0027t be adding built-ins! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimScriptFunctionServiceBase.kt"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"e81b0d756bb6acf049c588b5b2b2988adeaf86896269b196aef0c05fbe26b1ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This is incorrect. We shouldn\u0027t have an API for removing a built-in 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimScriptFunctionServiceBase.kt"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a50c1db6f27b3fa0e5e0167ed3623b3d8cbad10f0eba255b5d0f9f98e1492ab"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO make it possible to pass null instead of editor \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimOutputPanelService.kt"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a1c465ff4266de29e846af6337ea0a62472d9f92d3229c8cb33ef41de5057b6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We can\u0027t correctly clear global-local options \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimOptionGroupBase.kt"},"region":{"startLine":1574}}}],"partialFingerprints":{"codehealthFindingId/v1":"f09ff0025f5ffae249a482ff7e38edda647a89da7c6c560cf6ccd52844c152ef"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO [vakhitov] It is super super super 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf3eb9cd53c8e44e999fd7a2d5a6364c6c1a1c8af26332a71c0a949b8586ab03"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO [vakhitov] We should remove all of the secondary carets and return an offset of the primary one \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"abff5bbeec3e6014966cc8807a9e2bf7640e8c741aa6a263a13e06426b5a1619"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo should we move all the carets or only one? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"1045ac6108eeab8b96639cfd3cd01eb57ad9220ed4fc966e9833eac557033984"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo should it be the same as getting offset above? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"343c0e90d9d38b61b31330313b5f3226e9d839fd944b950c45d13ca32e1d72ad"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO remove secondary carets and return result for primary caret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee3690fde870528734bacd5f0dcea0162b42145c3ecbd0881b9501998d67911e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO why do we have this 99? (It is there since 2003) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt"},"region":{"startLine":643}}}],"partialFingerprints":{"codehealthFindingId/v1":"d31e4a516ed94d32ea207ff94371b02ace33e139e43f6c539cfa1b5aba274298"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider naming. These don\u0027t move the caret, but calculate offsets. Also consider returning Motion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroup.kt"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"de653825a640f1a5151e00ae2855bfd0556d6de96e9173dc917076dc69498d68"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: These should move to the Vim logical line at the top/bottom/middle of the display \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroup.kt"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9ca8b827b2b3da5eb2197d6940d18ee1aeb1740b64570810922f156480d0b6b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: These aren\u0027t caret motions. Should be moved to VimWindowGroup? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroup.kt"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b0fda4335ccb639d237bbeaaf77f15916225d72215d0bbafc88e5ba9e291b2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo check if set is valid for secondary caret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMarkServiceBase.kt"},"region":{"startLine":737}}}],"partialFingerprints":{"codehealthFindingId/v1":"053b35187a3fc1004de5789c30bc5ea8820d232a0259d37c3ed00219110132cf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo should it be multicaret? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimJumpService.kt"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"84956056f42b1fac287fafbe42902d6a5fbfe1cec87cf389e122979eb9c22b76"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo docs \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimJumpService.kt"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"affbf75614c9f51176b75b038a7462f2a66ddc13dd28eae2ffc2e873cdd8dfee"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo it would be better to have some Vim scope for this purpose (p:), to store things project-wise like for buffers \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimJumpService.kt"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f2701b1ec05808b8dc5e17a9f4b87ad5152d8019f363a949d4bcb734516ee7d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO find a better place for methods below. Maybe make CaretVisualAttributesHelper abstract? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimEditorGroup.kt"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"07742156ec1efd2a46513e34a45953a06022b712a270ed7aec09193f3f17dbd7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: [visual] Try to remove these. Visual position is an IntelliJ concept and doesn\u0027t have a Vim equivalent \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimEditor.kt"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0791f047da5728fb86d8003649ef39aeab534bd2c907d12d201693c843e4666"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: [visual] Try to remove this. It\u0027s an IntelliJ concept and doesn\u0027t have a Vim equivalent \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimEditor.kt"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"44cf4ceadf77f09c541822531511dd7ff9beb392992b3d3c06b56ea42b7e38d1"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME I don\u0027t want it to conflict with Swings \u0060requestFocus\u0060 and can suggest a better name \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimCommandLine.kt"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b5d09dd75d9543fdb823c27a865eade6d77c96c73dbb85d0a6d99a42589e163"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO this method is NOT preffered, it does not collect transferableData \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimClipboardManager.kt"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"f27adfe212285b2f4f6e2a08f8455f426b107f521b932a68fbbd7631c96ae99f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO  is it correct to use primary caret? There is a caret as an 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":1424}}}],"partialFingerprints":{"codehealthFindingId/v1":"af39583be892d4465e6308bafebc42e6611d92d0bf747142e1d6a8892a09b310"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: getVerticalMotionOffset returns a visual line, not the expected logical line \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":1556}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc472f51c0d2295335d9a81d957fffc356cffa9b539b68c62c9dd10a3575b194"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: getVerticalMotionOffset returns a visual line, not the expected logical line \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt"},"region":{"startLine":1569}}}],"partialFingerprints":{"codehealthFindingId/v1":"1784b4e1ec0676f6c0ed56878abf90b6b23fa40b5d637d80c4268855cf3736a2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: [visual] Try to remove this. Visual position is an IntelliJ concept and Vim doesn\u0027t have a direct equivalent \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimCaret.kt"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dbd8f2f6d93b765ea645aa0588791491fdba0d223f9907358ecce4e59aff7e3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: [visual] Try to remove this. Visual position is an IntelliJ concept and Vim doesn\u0027t have a direct equivalent \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimCaret.kt"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"22e19e1f0eef640c6c0d96de0eb1892fd6918d1fa97c293acc9c2db8cf1a3ad2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo what should we do if it is a error motion? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimCaret.kt"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"5af9e0f864756fe98b41eacb6915b149c550cf1f16f78bb0801702efd9fe3e04"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This option doesn\u0027t appear to be used anywhere... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/Options.kt"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c8cce3df39bd1fff3b0338eedf01d8c4a7c114210e443ec7ce506f21001e6e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should probably be handled when parsing the command 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/Options.kt"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"b34a463a3b061a6a78301e4bd7f46f5664041e57cf2be0d3da33dcfa1051ebb8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We should probably be doing this for other options too \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/Options.kt"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2438d024bb6b5ea13f2b78b79d013bdca9ba1e74b768fde119e5c36a293acf5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support script local functions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/Options.kt"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4203d87b2289de1b7f6a6f42c416538d35fd00c04006e4cc520e3711b70759a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Vim evaluates (and therefore validates) function(), funcref() \u002B lambda values when set \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/Options.kt"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b170f4e7dc848acd62eaa189e6fff2576a565927849a10559d9c7872b887a28"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Technically, we should validate values, but that requires handling exclude, which is irrelevant to us \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/Options.kt"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"85206ffeb3696416939023b1f69951a9b8b5797e123252fdc25457623f54e969"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: [visual] try to remove all uses of visual line/position. This is an IntelliJ concept \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/EngineEditorHelper.kt"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf55ecd434fe41b26a8617148dd51a82becb3c4e86a6bab221e23851901d1ffd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should probably return List\u003CKeyStroke\u003E to match the keys we\u0027re using in KeyMapping \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/command/MappingState.kt"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f5967d03210bc1dad2d1f5fbd15be8ab632568905a07ae1137e7d33d4307aa"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider removing/depracting XO, NV and NXO. They\u0027re not typical Vim modes that have a map command \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/command/MappingMode.kt"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ed571c48860cba298e5b909583d0e88303a443cc4e6c520ebeeac8ba6d0aa0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Try to remove this too. Also used by extension handling \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/command/CommandBuilder.kt"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"3101f55014a9009efd168a406579826495f6de479eaa3c5e1579e3107556bab2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: And remove this too. More extension special case code \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/command/CommandBuilder.kt"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed169e53f58d750ce385c4db8a6dfe668661875efbb8a909b02a68764046cf39"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO Looks like sticky tape, I\u0027m not sure that we need to modify already stored text \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/VimCopiedText.kt"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"13abb58d1154be4f39017f8dddf420d2c94c4f7557ea36eb5a67e297c2eb1c50"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: If we get 10 here, we return 0. If we get 10 below, we return 13. Why the difference? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"0246cb949093eefa9164225e042e4c629f7571fcba03d7c42ab4f7e5ac046d28"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handling of line offset is kinda hacky \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/ex/ranges/Address.kt"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec8174927fa1ddfaa296749f604966a16b7936e7fb357bce8d2f0730b45ddae2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //  TODO [vakhitov] it would be better to make this search PSI-aware and skip chars in strings and comments \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e7de4bb818ea7d103cf8452bf740b79712de5bf9bf521930ce526221d9f8b3c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO [vakhitov] should I implement BiMap for IdeaVim? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"4484e34c6cd86ebb6feacd9b266a307ac4004514f7787988e219e48cf147eb7b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO support delta \u0026 refactor me (mb use method below) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"e804e541f7a3b99ccb2340217f5ecaa54adc2e80ee8d3a86219e5107b6f03a8d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO what should we do inside strings? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14559a43d4f92c8aca3cab68ec10f0a4ae56f8f78587a2d7355867a394d8e0b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO please refactor me \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/SearchGroup.kt"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"c536e52ed14c1279175d054595fb491332df473bf7f928f27aed5a00b9fc0951"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should be normalised by the action \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/MotionActionHandler.kt"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"61357f65ad7ade74cb6c29b645e28fc4e951490fbd6f542042becd690711dc15"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Look at \u0027isprint\u0027, \u0027display\u0027 and \u0027encoding\u0027 settings \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/helper/EngineStringHelper.kt"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"15872d038b96f4d0ab66df5808e0d34eeea4b8d54f20f9486cdbe6c80bf23b75"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Merge similar code from ToKeysMappingInfo \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"58fb7d2f607c0dd2e4221a2d7d0427b1b9e6521d6b6ea01585d5ef2e1a527d9f"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: what is the comment below about?... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b6088f865b225ad07685495fa00662b0d771b9466dad9a1a11f248e5b72fac6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO make it safer to utilise key.isCloseKeystroke and similar logic \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/interceptors/VimInputInterceptorBase.kt"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f7a402b938789cf1a5f9e65fa2f6d0b781b832c209adff5175df8a775b3eed8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider having a shared Interface / comparator for Mark and BufferPosition to avoid this duplication. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/mark/Marks.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"d463a6082c0c727c0afe5c14615044145cff6484e463f14b18d2ce19a3a0ee93"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // Todo maybe we should use something like IDE\u0027s RangeMarker 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/mark/Jump.kt"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7175a466e4381cb22a669bbfe19147fce76bbfab267ab14146d5ede38698bce"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo 1.9 should return Result with exceptions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/options/Option.kt"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5eaaf2618056c4b89cc3395753cdef6553ed011c3e3db856af8656244a76629"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Come up with a more friendly API for IdeaVim-EasyMotion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/options/helpers/KeywordOptionHelper.kt"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f0170421fec421478898f74680c0478e60808a817ec7cd8b3d3aa79d9d7a302"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: SELECT should behave the same as VISUAL \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/options/helpers/GuiCursorOptionHelper.kt"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"9db02c8cc617554a0688cf70e692401ce1f4fe4dd97d05ee279496255c8e0c9e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should match VISUAL \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/options/helpers/GuiCursorOptionHelper.kt"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"18994296765a69b5199b2e7fe7ad914776d110b3c970b63744888bc98c787f04"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO [vakhitov] what if it is ImmutableCaret and it was changed from the one added to [caretsAndSelections]? We should introduce caret ids that won\u0027t 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a36074f449578ceca58ec6fc4c72ca4ff850f186fd780a2c25d34ec88705dc4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: shouldn\u0027t it be adjusted when we are storing the text? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"491aac8de70d3f1df7135ffaff8023d0980e63a8cfdadc4ce94c741de9bd3f8c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO do not call it raw text... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/PutData.kt"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"70287b9814bcf789826c4f211525b7d8be63d27217ea09226ab51b8b73b31ee9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: optimize by adding more strategies. The strategies should go from less powerful but faster, to more powerful but slower \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/VimRegexEngine.kt"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"8180fd3d0f8bc0542db92764460db81c4389e41a06c0ce3c1872835b70242552"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: throw illegal backreference error \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/nfa/matcher/BackreferenceMatcher.kt"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ea37fd91b61b97bea53693b084296e2f0171109ca5da1dc7b2baceeabac367"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Throw E70 error \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/PatternVisitor.kt"},"region":{"startLine":709}}}],"partialFingerprints":{"codehealthFindingId/v1":"99bbd5edf6ae63311f87bb5c94016590cbf11c7bd058e14a5127a701203687f8"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: so, we had invalid ranges all the time?.. I\u0027ve never handled such cases \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"fca2584af084e0c41bd3a1ff356234b37281eac299145db77f6b521aab4c4f76"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO why transferable data is not collected? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f12900270473070eb108701c1f31857c582f41fe95ef12f9524a56e4ba8c038"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME why don\u0027t we collect transferable data? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"13893a95026c49465ea58fec4c87c60417d0bf3dbbfebf11dbf760d40e1b3e27"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo we should not have this field if we have the \u0022/\u0022 register \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/VimRegisterGroupBase.kt"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b81f78bd5088af9a13bd37322dd2765f05bfb5e47e1244b8cf7fd3a9da93a51"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO should we prefer keys over text, as they are more informative? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/Register.kt"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b11191ceb14b3429b0bbdae0e0de54b1f9323197b7e61d04a1a2a694bdba9f9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO e.g. \u001B could be both \u003CEsc\u003E and \u003CC-[\u003E after trying to restore original keys \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/Register.kt"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d17ef8afab5a521df3f6f2c24c96f10089112e8d666233654843b0ab0b46fb7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo it\u0027s empty for historical reasons, but should we really clear transferable data? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/Register.kt"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a65244d5c10d058f54b909f3150c821a758b4eb4ca63bb8ee97a4ee8082f74e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo it\u0027s empty for historical reasons, but should we really clear transferable data? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/Register.kt"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"07fa3d8fa209ec687d7cace212557191e79445b7288e26e5e8b3fc7a73b53532"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo it\u0027s empty for historical reasons, but should we really clear transferable data? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/register/Register.kt"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b990d8f8f49810175db687dc4d88fcf6e6e47013570b482221b34d14010f35b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This check isn\u0027t accurate. Needs updating \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/state/mode/modeExtensions.kt"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"7621baab0ea64d7e9cf197d62210642d23472fd206ca1e85af7ac07d2316f1c9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo: see if this makes sense \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/ModalInputImpl.kt"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ebaa92330616597f26953a73237bcc60219bc08924813da470d07ef7c0d20e9"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX: It\u0027s not OK to call runBlocking, but let\u0027s keep it to have an API. \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/MappingScopeImpl.kt"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"b56639ee9ff57f013ff417a19be7aae9ffdd7ecea339a290aa4da5aa56156d6b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO provide key description for logging \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/undo/VimKeyBasedUndoService.kt"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc587d0974d590f43848d1aee6a5f35de26f68f90834c7b2e129f6926dc93316"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo rename \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/VimLContext.kt"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a369b6754f4e61e6b5eeb75d53a3c0f91f3d5fbddc85701ad8f146c657681f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo rename \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/VimLContext.kt"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"dded64602355db4193d6242a9066ce973a089fb11013d06616d04227caf3cbe6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo rename \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/VimLContext.kt"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5a240574e66f4f7c1dc5d06f9772333c8499fa90a9f8d10d5bd48e9f20773c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo documentation \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/VimLContext.kt"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"d059fef37e5cd9730762761d566b0c1532236c8af2e4406924275e1e6ed9c837"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo you should make me internal \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/SetHandlerCommand.kt"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8017227d23c1dd415ffe72c7e8e46ed4cdfd072029a3ab325761a772209b0ff"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo make it for each caret \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/NormalCommand.kt"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe01ff721cf847a6888df24b84f74809b4a06c15f986c87028f2643474dd99a1"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo doesn\u0027t throw proper vim exceptions in case of wrong arguments \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/LockVarCommand.kt"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d25d57bd62ddda03307aa1f28b060a13bf0b11317210530fee87205663fead5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo doesn\u0027t throw proper vim exceptions in case of wrong arguments \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/LockVarCommand.kt"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c94e5e32cede09747a5ffe3f86da6c49f32a5a4e24fa2f868c703abdc3e638e"}},{"ruleId":"D17","level":"warning","message":{"text":"FixmeComment: // FIXME: I\u0027m such a mess, please refactor me, responsible developer \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/GlobalCommand.kt"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fbf5d1fec96e2026be39c5af564f915867ad72aeb41cf656d7a10245462a3bc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO it should be provided by VimScript parser \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/GlobalCommand.kt"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"a85623fadb6b768b2334b5cf00b09dfec2cd3cfdf4ca30b01f718b8a30a7520d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 26.05.2021 break check \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/GlobalCommand.kt"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"b74b987a74141c3eef2d54fb11f3eadc61dd5662a1060fe396849910108e863e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 26.05.2021 Add other staff \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/GlobalCommand.kt"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d114c8bf000e990132e1a7a71f1552ca38e897a245ab03853b1a18c2149b579"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 26.05.2021 What about folds? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/GlobalCommand.kt"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"23f9f0fa998d45d1ef5866fc0a2ba7ff990e3d571ea5bb0658b01e3f31efb2eb"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support \u003CSNR\u003E prefix to list script-local functions (which are saved as global functions) \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FunctionCommand.kt"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0eacd6bc23668793668c8c3dfd166f8fdb673fac2ddf25e81972dd1e760ac82"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: VimRegex should throw more appropriate exceptions. E.g. \u0060E54: Unmatched \\(\u0060 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FunctionCommand.kt"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"379cb40cc392ed4f335c06a6e6cfb751aa2a28936dc8bb70ff4b86ace840164a"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support the \u0060:file {name}\u0060 argument to set the name of the current file \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/FileCommand.kt"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb3e77c19e2cd67e0d1ff98b23dced66f7920cf981f2381f479366a34f715f3f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO do we really need a tree structure 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/ExCommandTree.kt"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"c520f8e1d157d9c55c1249d7e9f58babd9bab22b72399ee5e10ef1aafdb86f06"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should maintain current column location \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/CopyTextCommand.kt"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"e309a557b159d48a509dd27ff90da672fc07d880520cf85c6564e7d80e58316c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Consider adding something like ModifiersFlag.BANG_ALLOWED with validation \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/Command.kt"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"90338595a52ebf2d5a9b9acb22c229b3bc67c7131a902bd88436e1dbc4fdf97c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This is initialisation, not validation \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/Command.kt"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"7001cfcca50a46e954dfd24ef69925915cf3327425218a1afcc6a6a41682764f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo add more exceptions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/CallCommand.kt"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1b183037336fdfea23249e8ba1a3058bb04ef3ebaa704685d2f925c637890ea"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: In Vim, I only see the check for nesting, not that referencing a higher level makes it fail \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimList.kt"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"035ce079763388caa7563138703220ebbaffe094c24466589bd366f409f1f271"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: These constants are a ticking time bomb when combined with :lockvar \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimInt.kt"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcc74d0ecb2fe03d074a6abbbbc71a89d54bc265f19ea3e8245291326b2e075b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Using asVimInt will use a constant for 0 and 1, which can break lockvar \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimInt.kt"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4e559d909a83b27a5ec4bc51841cc0ec1a8202aa7ca4d9c48fb1d002afaa7a7"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We should return some kind of nullable string 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/RegisterExpression.kt"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d959a37c3994908060860deab06cd6d80db350bc7afed74c750450690e6a70e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should be E521: Number required: \u0026{option}=\u0027{value}\u0027 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/OptionExpression.kt"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"b36e76c7b8effdc112b38a0d51d0c7223ec75aa44fc2ef4cea548033fd8c6c0e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo more exceptions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/FuncrefCallExpression.kt"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8301f3776ac04ddc9a1ad6a7c7647826f10d2596f3ab3a042f4dfea29ed1b0e"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: The name check might not be enough once we properly support script-local functions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/operators/handlers/binary/IsHandler.kt"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5fe54d707298e4aa68f3f427f3360b574a1a6639baa27f86f1af22abd81a6c3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement for Blob \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/operators/handlers/binary/EqualToHandler.kt"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"f46ad00f5a8f1f72071f6d0c6613ff7e3ff6bbdc079e22791ed8657b070bdea2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Handle Blob. Presumably both sides must be Blob \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/operators/handlers/binary/ComparisonOperatorHandler.kt"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48633d3e520f0c8f3cfa57bcb9e87320edd5f27925c17681a2e2be950a60261"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo in release 1.9. we should return value AND throw exception \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/DefinedFunctionHandler.kt"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb3f6f15e8ab803e52f99dc785992e3e1c354f828200a9474ba6b0d97a55d437"}},{"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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/DefinedFunctionHandler.kt"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"c79e077990670b6976975e8c07d54ab25ba404fc817487bbc52645bf36c85fba"}},{"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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/DefinedFunctionHandler.kt"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"62c187a3cf6ba67e8f27c6fbb4769f8a779b8378ac1bcb3c95eef8221c637b89"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo in release 1.9. in this case multiple exceptions can be thrown at once but we don\u0027t support it \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/DefinedFunctionHandler.kt"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"84b9ad198c3781c7ce700127dba2e4bf78767691a055f70939e14b90e5d82712"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo in 1.9: also throw all caught exceptions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/DefinedFunctionHandler.kt"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ad87829d577a7214276a4874a0ca3517f510de3fdb22faf0c7f5faad6d66dda"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Validate index values \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/MapFunctionHandlers.kt"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"5503e0e93f0fa96a0d26f8da37ccd31af8db125b80bcdb4fbda54efc941f41e4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We don\u0027t have a way of returning error when invoking a 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/ForEachFunctionHandler.kt"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fbead371de4b825ca1695644562f0ff96d8bbb5f150511fac6357bb5996abd5"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Should return 0 on error. However, IdeaVim does not support this and can only throw errors \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/ExtendFunctionHandlers.kt"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"d787e6217480ab411f8ade715cf2ec714dfcd1434cd0ddc94d56807a95ebe738"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 03.08.2021 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/EmptyFunctionHandler.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa25c2934e50a184b765050121fc391990b737c8c2f527af3441cdb32e3d0b86"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: 03.08.2021 Support second parameter \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/cursorFunctions/ColLineFunctionHandler.kt"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ea7991c9bb822ed3c677f27c9f433a9be2eacad7bea49c7bb49d744aff6f267"}},{"ruleId":"D17","level":"warning","message":{"text":"XxxComment: // XXX Should we also check the current mode? \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/cursorFunctions/ColLineFunctionHandler.kt"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"94034d55d518adce19efbd2ac0b81150627105c4d04a4d79a4b7c6cade2ddf4d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Vim actually shows an error AND returns 1 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/InsertFunctionHandler.kt"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"6da4860074ea9d843cc5ed321792096d47c53466ea55147e4af53f4b2de16dcf"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Vim actually shows an error AND returns 1 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/AddFunctionHandler.kt"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1d073a33fdc5c2a517f7349d97f1973a0c07a2cea9588626271db3236ee3d3c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support Blob \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/InsertFunctionHandler.kt"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa6577335d7e6f7d3f7480644ca80eff4dba7080a8c5c1c6fe1c355deff40f33"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support Blob \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/AddFunctionHandler.kt"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf681876873c215cfbe12f37898b25f969679366c1f831fe70cd8f04e766cf8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: When fixing locking, re-enable the tests in InsertFunctionTest \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/InsertFunctionHandler.kt"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ef4d0901ecc597a866fed9268ef26112c6bd708db225f13276afcd103b8c782"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Add test for funcref/expression returning wrong type \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/listFunctions/IndexOfFunctionHandler.kt"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73f40a00a984a8f3fede95b8d2ff1a454da6dc2cad6dce17c79c27dad1281f4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Support \u003Cscript\u003E, \u003Cbuffer\u003E, \u003Cnowait\u003E, \u003Csilent\u003E, etc. when IdeaVim supports them while creating a mapping \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/mappingFunctions/MapSetFunctionHandler.kt"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"c861d68d69d25d12cdb234a9d9c2bab8f86485d2cb82345b64dfb78ba2a2acd6"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: This should be the keys as raw bytes, i.e. with special keys encoded \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/mappingFunctions/MapFunctionHandlerBase.kt"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"df74d392d6b215877d992daceec673adf2c017a81c362872b42deb24dfc46a71"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: IdeaVim does not currently support \u003Csilent\u003E mappings \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/mappingFunctions/MapFunctionHandlerBase.kt"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf80f444ff54e56a6d209ef7d5111d230ad6e32c974f2d18a00c7daaa4dd8f1f"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: IdeaVim does not currently support \u003Cscript\u003E mappings \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/mappingFunctions/MapFunctionHandlerBase.kt"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2f9417d806b061608b3c2d54ecf8148ce6d7d68ddb54bb828fdb3244a17f1a9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: IdeaVim does not currently support \u003Cbuffer\u003E local mappings \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/mappingFunctions/MapFunctionHandlerBase.kt"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fc306c6c98ace813263bb15920f08d84ee5a2ee85dc566e5418a2ba8854d1be"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: IdeaVim does not currently support \u003Cnowait\u003E mappings \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/mappingFunctions/MapFunctionHandlerBase.kt"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"d45c799929d3b86f9a707d4bc36a85201cea0c64aee6c7fbfda47864cca02418"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: We don\u0027t get the exception about converting Float to String \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/mappingFunctions/DigraphSetListFunctionHandler.kt"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d523c45cba62a1ab515a4e5b02b0361eeee253ac3c248da7d1894986a9acda"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo delete try block after Result class \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/IfStatement.kt"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c7a4d819b958f3cd45bb9d4f6ccd12c95a7ec8e13677fceabf16cda5fcd7cd"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // todo refactor us senpai :( \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/loops/ForLoop.kt"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"d02c0604d71ef3f35340e4ba9e91ed5d868d2f1068f15e41293bc7a0a0c60b0d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Vim does not handle this case. E716: Key not present in Dictionary: \u0022first\u0022 \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/parser/visitors/ExpressionVisitor.kt"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f4eaf7a5479e45e5e3adecc0fbb431b861d5508b5353345a6439ee6af2ace87"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no project overview: The document begins with an overview of IdeaVim but does not state what the repository\u0027s main package or deploy tier is for, nor whether it contains a README that explains what the directory does. Add a one-line description of what IdeaVim is and where to find usage examples."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66dbf18d06aa983c06246108610908ba99aae6784280b3aacd1a6655733d71be"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no installation or build instructions: The setup section describes installing via Settings | Plugins but omits build/setup commands such as \u0027vundle\u0027 or \u0027Plug\u0027 plugin initialization. Add installation/build steps for vundle/Plug and the .ideavimrc configuration."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa6bfcd5c6ae231d1b8ee99bced50b832d1f61cde9da6cbb533467b879a57db"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no usage examples: The Get Early Access section is cut by the scanner; there are no usage examples showing how to run IdeaVim. Add a short \u0027how to run it\u0027 example, such as opening a file and typing J."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1355eb4e127a4bc9236772ce1c46f09510aa9286e7a06d1e47f308229df19049"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no contributor guidance: The README mentions contact channels but gives no guidance for contributors on how to submit patches or files. Add contribution guidelines covering pull request structure and the repository\u0027s issue tracker."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"620f29787918fa3406ae55cb63eefa1b50410845435c4e47bda852816aaea084"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 2 of 14 project(s) overshoot their size bounds, lowering Project Cohesion to 7.1/10. The most over is \u0060vim-engine\u0060 (68982 LoC, 1799 module-visible types across 101 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":"D27","level":"note","message":{"text":"High interface indirection: 71 % of calls go through an interface \u2014 tracing a call means resolving the implementation each hop. Prefer concrete types where there\u0027s a single implementation."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cdce37f9abf7531f8d28e92afaa9d119cadea0ab8dd2d3958949c20b31f486ec"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"29e72cf476d69ee981f1b9e99cf03aff70ac889a807181eb6a93db4ad3e16b5f"},"properties":{"commitSha":"81d5c06ca334074b80978e6dc002ea71ec1055a1"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"108daee014e6dd751aaac23cf3547ad94b25048539d65a51e1e98e3fa59046e3"},"properties":{"commitSha":"d0d53d7d209dc0d285a85bf185daa8eaa25a668e"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"759ee5f8a986654af076ef0c58aa75626401f91f32023360798b942b086a808c"},"properties":{"commitSha":"eb6e0557a76183ec929034a6993c6ca07ed18449"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e25e420124cf46130d2a20562f576051b46b1b61bad3b8b9a512cd2e9766cc45"},"properties":{"commitSha":"eb6e0557a76183ec929034a6993c6ca07ed18449"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d5b8f11381d61a58459ffc7c595fd52d09c03c711894a63a9578043d2338412b"},"taxa":[{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08: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":"93675d9c950a8ecc38bfab53be1b23bbf33a642b6bceaf15af5177043ce782f1"},"taxa":[{"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":"e17da7b9a71677f346ebb2de74e25ea7298e4ba6c1bb7f42ad05b9be5f57fda8"},"taxa":[{"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":"210aefd79927f13dfd13d6b41c03018e4a0390d41392d4fe029c0e4a691691bc"},"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":"33f82cee7a79271920d45dcc0da0a8584f9373e5305e30050192cf079db61226"},"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":"71f1e47a7a00136229559caf7979202079c5104d94531e658600de26138c6fa4"},"taxa":[{"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":"c5fe9ae43fd1c389324f5e17f3728bc1075eac7f859c0096747eb76c184af285"},"taxa":[{"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":"61882cbe17a694c2e461787e99cfb9483432db7ddc279eb4a6c065b62b30c21c"},"taxa":[{"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":"10c56a38858357ca9e1678c77c6b09a50a04b3f7d5c5aa9d458ffd15a74a7c6a"},"taxa":[{"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":"caf02807f39b78588dd05fa510cac31aded94d011008f51f41990adf4082d513"},"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":"e8b6b9278a297f2ed2f84e7c2e63ac7aae4f3b024abf25e909a03532bd8d7df4"},"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":"49e9df15abb5f92add0830591936c7eef68c563b22208cadcbe80ba32728ab96"},"taxa":[{"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":"d2bbf4db0c0e09606afc98b04e17df3bfe887cdfdd807d54822b0c9b8316e441"},"taxa":[{"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":"d0d61ad7f5c3cfe6bd414a78308e225341f6cc1132f67dd284a113cdd0e82bac"},"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":"b93e2e144ef41043909e50d9a01ec6d455f20cacc33b57432fa0ff656fddf9e9"},"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":"45cab76137525151aa1cc396ad56c5c5ebf5aee3a93d4fc16c1111695089883b"},"taxa":[{"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":"a529a0c63c5008635c205b9cfb1a19d891f581b89038ca767d5b7b852f624119"},"taxa":[{"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":"f85702ebf7e0594edbb42f346e8044d060d66386e82edd520f1ac528b3ec2fc5"},"taxa":[{"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":"a257bffcf0e12a441cfd754f4844419ecdf3922f90c1dec9406c1a6ccaf8275f"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08: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":"793c8c1293ae062cb897f9e4d163e9713730ad6ef788b1c27684379127268c4d"},"taxa":[{"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":"322c27c54b872d2b9c699674132398794ff246cf6603f9a0e805ebe783bf573f"},"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":"4abc55e8e00e01d7af0aef60aa62a0230b48cb0b206340c4e422b9e56404528b"},"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":"9bce5708b93c9c76c02bf21e4ccb0217ec52f9c1bcad6783c469cae9573c4f37"},"taxa":[{"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":"dd2ab60f0744f0fa3ded8d666143bf909ab8a2e8348ad2ddd8a93156d3adc94a"},"taxa":[{"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":"7a29df3c4b73b38337ac0c48c825ef6aace52faedb76536737648711426349e1"},"taxa":[{"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":"7edfd8f4f5bf8e12eaa030a7c42ab1e660cfefd97a58fe598164ecb96a02e3c9"},"taxa":[{"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":"fbae55df5f85e32ca32b5237b845c7388ab1f1cff2e732654830f8f06acc6881"},"taxa":[{"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":"6ee619dcda16024e8ebaea313c1b5ad39a0354eb5f89ba7482d7e9a1e0450702"},"taxa":[{"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":"5c0c37e9427427887d8155cfcade8a6d7ae09e7c937ff834737a1c7b42cee690"},"taxa":[{"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":"61075ee8481f7376d9d3a8da3102da7413c69451a17b89d6b89a8259612ca337"},"taxa":[{"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":"8e9802b9034290e59442f37bd983182e4dcdec9a4f1571661ebbd12912789879"},"taxa":[{"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":"75be113929adf7bb20385933d11e33167ca3ab49cf034376b88ad00acd1184bc"},"taxa":[{"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":"6859d860c4d2c6fc85a13bb1d56999176d799ae883f90a0feb732623d04dd11e"},"taxa":[{"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":"52c795987b359edbb6ee7685919142110c1ab7e3ff1f88ad00aefd0eda144ab1"},"taxa":[{"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":"82fff18b3c99963d9200a1faa33575d58e211c255626585d9851ba5a7869319e"},"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":"21a33d4ad231839dff65dc1ee9ad4061e58d7c858c98b0583c0032715b4c4ef0"},"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":"8310dcc010ff380fe8a0fb2afc699c500e64dd8aced6d17a4baa179b1a2a910c"},"taxa":[{"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":"b898e74bc8112caf3c26769e5f9a79f8d535420fcc6332c063eee23d7dbb3fc1"},"taxa":[{"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":"1d0a85e3a8033479a457a48142ff37a8bb41c1546f63ec272a7e5f7ac8cd67de"},"taxa":[{"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":"bba095ae0f28af6fb8a1bc3e382738468703d153645a2519fe4209ffbf73ddb2"},"taxa":[{"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":"7b375482aaeed12ab3040ebe38246efdde3be1d25b3e28282f88815a6526e147"},"taxa":[{"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":"82fa16dafc91d2497e139936e3ad36f3f16305e15a0141dbb2b717ce7d066165"},"taxa":[{"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":"9e485d914f767f8eb13ec62378532804bd334d8b610ffa97d1ab3a3690b5d5f0"},"taxa":[{"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":"0e9c8c63a5b8d3729faf6b66011980d37ed070dacd196a3cbcc778875a7c5cde"},"taxa":[{"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":"209f964d4fb7c2a0973cb00bd9aa51ac79a9421009e0399e53d17ad2a1508550"},"taxa":[{"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":"b0ea9d822fd2a8238483321030905e5b2f62fbd8e0e88851cc25e35b6585b123"},"taxa":[{"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":"f1c57a69a057d577ef0e2d40c6305b9c0173d86ad60d3921d72ad34365a88845"},"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":"7b993772d481f0f69d5a07df6147d1e812cc04dca48086d8a79aa8870fa5fc56"},"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":"0ecac157baf02565872ded68f4c0fa41aef478755bf80fbcf78ee516731fbbde"},"taxa":[{"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":"7c2580d633b9a715d849e117e80c2232800abec8b7ec5fd34a5f652e331ed83a"},"taxa":[{"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":"443b2333edea25c1ca46b983307845ed2e1c20a7e0ac68e894148b98b664c4be"},"taxa":[{"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":"32119c2e7f708df906e0552ad9c7995317442e65cd3a9bea478482a375426bdc"},"taxa":[{"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":"9fac547e1344bddbe18946ec51f7be5e006f21714ea85fed6dc919c2d9ce2473"},"taxa":[{"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":"953f86b0a73abbf6da09301a2f6453ce2a784dd3cc84bf8eb2d7a89b64b12f92"},"taxa":[{"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":"918eba6fa694c3b1d2818748cd8eafdbfb836cd73d65d1eda4ef8ea00822f127"},"taxa":[{"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":"e8da25fca8984f1c61a99c5933f1d2ab5415e4897db0f58520c38b628ecdfd15"},"taxa":[{"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":"8c955f5b0b95b13283c92c592cdbacf86a24c1c8a0734d43f0e7f5f67a299aa6"},"taxa":[{"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":"fcf6e68601b8e2b6fb11738ebf00129d092240ffd8b590319232cfd7cb77822d"},"taxa":[{"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":"7c1856ad5c7577b3872203e6972e6196c3e2c1dc09053cd5a011fed46ae30b73"},"taxa":[{"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":"8dac5fd9060eb1118b396e9c6e02332161ae3b60636d7102a0da2cfa488c3b68"},"taxa":[{"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":"f3d60e51ac92aacffd216b24fafbf8308be78579a331d00d749551f54930809c"},"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":"a7b974beec111fa3447d09160b11b94552628960b41d9b867c8afa9799492173"},"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":"17e933c789afc85d4f094d7d3d15c10d6513010b858ed5aa4cc52864a8818870"},"taxa":[{"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":"a539987f4b8712b658a06373c77f5a3187931c77bed2a63f395303dfee2bd968"},"taxa":[{"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":"93e7a15b75b08ce71ec513391e18b8db16558d361816278dcf799e1aea85936c"},"taxa":[{"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":"be0c5a2cfb3167afe0e059e5e7ddb02c6088b97e118bc7e0b66b890e53ba86aa"},"taxa":[{"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":"b208dae7bf4b8a797da642fc985e7b42d31864815815193c55be6f7ff8c5b2c4"},"taxa":[{"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":"87c5ba2d868c697f351284bd337fe38a6786e4f841b2ec68dfb257cc03f283b2"},"taxa":[{"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":"f29ba2b8f04c05ddcd91fa419420c7911b47de5b19fbaa50817dae098c89e6f2"},"taxa":[{"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":"d8cf82294af934bf090fdd291321b5fd474760684a1d4dd36313e0fe34923479"},"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":"84dff7fdd445a1bc97f22b8b4345fdb0a2462c5d15ec2c2644e99a27f3d5dd68"},"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":"fb746b36a25047c573064b51c781fdafba28256dd972022a43f079965ec8606f"},"taxa":[{"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":"a378060bef1e1cd2d5c61bdf6b2d1b0219f7bc263184c08f20ff10d986449acc"},"taxa":[{"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":"2393a04a0a5af4d7debd93f6aea911328f5169d3b57fd80ec079c629b8288c39"},"taxa":[{"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":"e513738534417ffaa23ec066e342413010f8a037206b869a6a0f19287398f48f"},"taxa":[{"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":"41bd3af476b9873cd1a91916c7c3fbfb9429b275495311e852206af277b42aae"},"taxa":[{"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":"068bb417199d1f490c9526dabdc3a4f5154663ab885e927e1393d253c8b2b594"},"taxa":[{"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":"07edbba0ab79f96003b876f14f45b0958e488abcf356dd9d6a0a8d1044f15b2b"},"taxa":[{"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":"1f41963b01323d1593783155790cd51db3a1afc303f90eee885ab24c67e1b3f6"},"taxa":[{"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":"97f11e1ead41208b884f7aa1f405973f27d258974c460e12880db32ab3160d43"},"taxa":[{"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":"51d634a16e7c1c0af8bbbd6eb8744e17333f424b3a6fd4c10ec8005721f87add"},"taxa":[{"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":"e89d14f91d1cbe340d92c8c0f0af1f884aa4917c2eaf54e698b5b4dded5a3bee"},"taxa":[{"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":"dadce93cfaeadfcda19e79c998f5740e18eae37ad8619610fbca0f7e0602a93c"},"taxa":[{"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":"17b80c765c3d18362f5fe30ff47492bfb3237b6d1e527cb185a49257bc0c1c34"},"taxa":[{"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":"74f9f12ef27b08f281f2563a9341a0e42f3654c78b476527a8bb25d844d50f3b"},"taxa":[{"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":"41e9de8bb9e0aeb3069daf5a59ae6afd59dc25c5fd62a6d4c09c99089393c769"},"taxa":[{"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":"76400863ab3a7536cd035e69c3d4770100c0658aec62ae386b3f3e5f25b857c9"},"taxa":[{"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":"7e3aa554568079ca2314ad51d67d2fa856fd9339859edd28ff7eff6d70adaf54"},"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":"c9142fc51c3643a6f156c6a4447e88bb776091b343965f77b5f335022e72c751"},"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":"93401d2a45bc55057420bc49cee0ef0d17e62511a5b588c08b87846bba73e563"},"taxa":[{"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":"24a28dc0ae960525fbad91f834010b4262b9deced7eff0774102afad39de96f1"},"taxa":[{"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":"2c3afc78f81a646029ee796c7f68b3f2074571d6dbfe54d33602b6c7a40bb63b"},"taxa":[{"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":"498b3d89e2819064bcd5ada8f2b285d464aaaa329e08c8ba37178d2b36525b34"},"taxa":[{"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":"0c78f13d3e80408fc852d517f5d33f5589953b79ea24629172a860e920d15c6d"},"taxa":[{"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":"52b08c86a599ef6ebd55cfad5b3826c0b3ca8a8b8aa2923208fbf88bb821297f"},"taxa":[{"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":"79094b0df67d872c40654ef5c4bbf92bc9f382e7f3023b17e7b3982c693d9051"},"taxa":[{"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":"7b756eda883718656f5f0d085891152ce8ccdc182d6bebf3dba1726940cdf9ed"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08: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":"53e3557407b472face58dd4cfc5c4ac4f9b9a3e840944acf26eb6c8509e4729c"},"taxa":[{"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":"5b1b19cd34988af73c6a0138cb1b79784c66a35dd9e3f829bb244113942f3d3b"},"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":"7246c904e57af1354a832aae5dcac9b182c1e67241bc1815b5dd09bcf4a0ae2a"},"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":"09e492a6a8103b5f85832078662ae878da13d10072526e4a06e0745cc3b51179"},"taxa":[{"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":"f1258e6546487438bd1e8989585e660d38fed6454e4441e6d3f0346de851b6c2"},"taxa":[{"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":"af7cde083c314d9c7b3af575ded9e0245042adc2f63d6811bf14aaf85570b765"},"taxa":[{"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":"40878ec4a3fd2f2c9676a42a8ba3ad0c0e98060527e28376c9e03ab411942996"},"taxa":[{"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":"688505a391b7911dce3f4ceab6e3e5ff340e09a495f2a72a1adea3643c34e416"},"taxa":[{"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":"05a1821641ec96a77b2c46c56b627cbd825b411c110921c00f6784abbbd86ec5"},"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":"76d6d70c90be226179432663f2b903e1d268cc5775a5d94bf0fc01f04e4cc1ff"},"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":"0402d58e8291418409ad9dbb21ef2d3ece097363f5f2b920276e88b7ef4f5f0b"},"taxa":[{"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":"136e7268c942d5bc8b5a33407e2218e6c155ee12c38a26ab49668cbe2f2aec39"},"taxa":[{"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":"5463fd57fde07d1368bd051f745a8916c2f9a5fe4281f9ac9075776fc1d9f95d"},"taxa":[{"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":"35efee51521554e40c744bb0f40af570273069c8c6685cfc6bbb572f32626fbb"},"taxa":[{"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":"047844804074c8aadb6927452f98c7e39a226b225657d943f56b62613c90451c"},"taxa":[{"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":"ef8b4862b36da6aa187d5df9d595d17273c9ce386d8c0b98e9b16c784c72e55c"},"taxa":[{"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":"0c18725a85e66b24851dfd628fee34004a020da46d767a535e11f9c4c75478c1"},"taxa":[{"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":"e3fb4c58cc903464b2e31046b3504729278322b35171fa9c77658a83b7487028"},"taxa":[{"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":"5c7c43b615e8c9c2064fab27ed874d2ab9e8896f24c419954c05448e42b4fa5f"},"taxa":[{"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":"bb28ad07149a59d2cdeac692bad8d3700a168809cfa6e1ba0f3e2cb621295269"},"taxa":[{"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":"a46c40b3fa4e5194b90f8ce9362cc4f4bb4fc4058978391e8a86b36c1f5830c8"},"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":"ee2ec884a0c264174cc1c5d0d7f74fbe779c25d01796cb8d6b02cb0c6a32ede5"},"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":"19f82ed438c5595b343cdb3874be6cce327be0baa98cc6edfbed321bb554407a"},"taxa":[{"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":"cc320d4513156a9398311ef3bd55fef6cf88102b75f5c402159934f8ae653e2a"},"taxa":[{"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":"2ba58fae9bf8f1288d540873ee39a4efcd09cee052807708b97a255e5ca2acc9"},"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":"011b6ce5e76c15ba3160fb6dd295ba72f18727c98aa38fdd3d93ea8c56cb4ae5"},"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":"76648d110f11d1f70cbb09613c0430e7bfc637629f6cf377d9d406c66032461b"},"taxa":[{"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":"401887e09de8902b500beb5eb972e3a13818763a82252c0928a94a552dc548f3"},"taxa":[{"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":"a077726f7008aef285f45eb70888b7c3a085bdf418cea26e34d8c41444d4a2ae"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05: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":"64255bec0b14917bbddcb9896528713711fe3ff455851c3b50e67e5f83dfe519"},"taxa":[{"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":"3248dd135f9917307b2304c348191f3230a63e2b488304cd9d2cc82878558a1e"},"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":"9d1b352d59367c0c75703a6dda3160a38ac4f9566b7ec2f5e236583004408458"},"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":"10365bd5e0720bd7619553e86dd5e196b4ccb2ac63c4b8dd4beae891ce9d2f46"},"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":"45f2949a6e5b81b13a267f471ccdaa22272f47b6b92c86edd34bf1263b1af6c6"},"taxa":[{"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":"58ffec4b8868dd35a981f6b0e6d10aaf74fb09dabf03d280ef239062454d1546"},"taxa":[{"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":"1f0164b01393f38e8977e268e0918704b0315e41e50a264bc714bb7685bb586f"},"taxa":[{"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":"2f01131abc5d3b84bb16ab2283891edbd37bf3bc6d5591eec4b0adb4a9b2a782"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A08: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":"b1e3db62a2a4e254e161d65322bd2662563e939a47dbcc12b2ac6a97e97ba081"},"taxa":[{"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":"c060fe2cbd735b1b90cb96113572305b47f0b7bbb46040ff7d5a6a87cc0c750b"},"taxa":[{"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":"c4cca2a52e3cd46a7a38e5dc92cbb11c409cd9969091f6f2777be369c4be560e"},"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":"f25de7ea3602bcb0e3da5aad19a32eee46ef22e788e69e96808b48d9388a26d5"},"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":"e0ba7197da3d8593635152ff6137f7ddc694a30925ad19e0002a111909c55859"},"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":"a31a5240565236426387a29875ec9db1debe621a53f44cdf12581a83bfa1e548"},"taxa":[{"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":"831ab2e972835bd25a9efef97f548642dcff0c7ec935dc1ec8ce21143cc726a1"},"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":"7e5d03d8fce83bc8f33ac78f8224de5bd11e5ef9014aad69c4ba11b3e9734b45"},"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":"e2455d0106e494343ed1077076b19b583fd13a2ef133f4a47edb625437a72cd1"},"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":"e77adbce7b211a66f88d3840561783e8841225099c36e9a822d1f32cd13d344f"},"taxa":[{"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":"5d62f879fc610961c40d4d5c85ac59742fd40d85b99dc8b081688f6828634783"},"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":"61c5f2aafb9dae7d18273623d5104fc9457d7a63825964bec97b986178e10184"},"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":"e369c5debd1799e72a51dc3a657d9214997c948e5eabdb95a7e863c0be84651e"},"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":"1d788e864f26cb7a08c53437639a0d463457e587245f8d27b590f501fb4bce10"},"taxa":[{"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":"2219fae7153b2fc08dafd3ff15b47a70c4905459f2b73b7fd3057da9d78882b8"},"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":"cf462a55943b082b03229720d397fffdc4f2220d0f49e24003c0079ec32870d1"},"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":"732b645b6e30808a2abb8f40656fbd602196699b0c114af390c6ca2129dcd9a5"},"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":"4788fb2d8cfb490d966faea0e7369b4dfb1642ec35e0d6a54a50de7c92fb94e1"},"taxa":[{"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":"e9b1c7213b44db19105741e16f442aa07012d81416d02ea3942085bfe8875f8c"},"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":"80c6485ce5c28698a6095ad2e0dae0c7047c58248a197e8abbb18a3955a90ad5"},"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":"15be2fcd22a5f99d037e6fcd1f1ad650f85f6624fda693b551ce85db3b368008"},"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":"40477cd4c2cbf5c8776fe2acced962c7ba003699d3418ba50b30edee54efc588"},"taxa":[{"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":"6f3f44cfeaa4c2cc1d8c0239299f1168ee4dbe5e88119c3f3d9d8217d88b3625"},"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":"a266a73ec7c1892c407f36abea1c2f0fd7fc00b57e2befd92e7f33727fa592bc"},"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":"e906dcb30c9f31fbc4a674a13dc7e251c3c9810d36fa3ba6c642416720ec4a9c"},"taxa":[{"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":"ee329577d9e85c61140b113e9ee1d2bc9ff87d55444c60d56f274cb2c5661694"},"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":"0c8456039f519aa9fcd587b7984f4a4d911ac6dd16102da6184fb232a27e5b50"},"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":"d607bd1f84c98fb16092c7309bab38d56ed10c160e1304321e1641687132de8e"},"taxa":[{"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":"9928f268f832ec40bf13ed4dc3e7d90b1280493d29baeafee03976fcf298133a"},"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":"834d7cbe60e08f19a36d34764f889cddbb05a7af228033a494d13d20453e0621"},"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":"b866317e0d19b4d220b8c800d56253a88d14eab0232adb6276b2c20416e27f7f"},"taxa":[{"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":"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":"d690f29bdc1ce3a8cf988fdafe2854e659f8ca3360ab6d7e43f9fa13b50b1e4e"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","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":"1880a2a010742e4be8d250853e5e94da6183800814f58339b4aeb0ef3512fcef"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","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":"f03401f752d991853a0cc14b4e7de7cf300d5bb26640be2b6b6dd46dff7c4191"},"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":"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":"7d2ccccec90e1c3a7f4dad0366c9efc65f19834da0aa98b058be17d6f03821fa"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","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":"b8960bcca6b20579847c1f982141962f46b37f831a686e45fa566eeb4295b5c9"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","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":"7a67d7f4efa09826d44ce991f157598a6eb11ab0b812499609800f4e9d2ea829"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","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":"f7a60baeb466ed9a225214d6b19f5d43fa3b295b806afc86b94c3faef232110c"},"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":"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":"122f01a1e439a548230268cee832e233015d89bac3aa19faaa4fee381ab725bd"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","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":"55a9ba8f4dc7d074875756baaf555fbfe916465015b5a7155171f6c3484d91e7"},"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":"e00286aabdd3488ff3fdae4792ba3087671741927732b731166e54913525ae3e"},"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":"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":"31b8ef6f8fb52e1c45e6dbabfadab57311d7d7934a762e6cd29a4ef626518454"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","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":"ce113321a48d8ab0b832d245a372372ab900f940334518244a0b290d69ae7135"},"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":"74870a2c475bed4d21e4a66fe548f6aba729c99d8df6fc986f0ad984a628f5ae"},"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":"15e541e2b51fdca16b68d4cf5779ce8c1fade094262be276ece0bc826e5e6cf9"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","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":"2052a7ca26a1576e95dc89fe5621133b55d04cb17604e44200c21a5ae9ee3b54"},"taxa":[{"id":"CWE-1104","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-1352","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-7","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"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":"9463523d46dc069bda70abb19ccf34d540fb2f694af267a4ae6b1bdbc9d5707a"},"properties":{"dependency":{"package":"vitest","version":"4.0.16","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"test-or-tooling","file":"scripts-ts/src/buildWhatsNewSite.test.ts","line":1}}}},{"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":"d9654bca0072454dde3fc7aaaebd5fc8080d61fa9d30d99fcc21b414b6c686ac"},"properties":{"dependency":{"package":"nanoid","version":"3.3.12","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2cd857de255fd1710ab0fe5bcabe5cc7dd3a2e161ab7f9bb605277be6c5e4256"},"properties":{"dependency":{"package":"postcss","version":"8.5.15","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"33fc0a15765b0fc4bce2d7b528d8c1109b174083a78f137dda835c1133b3dc66"},"properties":{"dependency":{"package":"source-map-js","version":"1.2.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"392d59eab5c6d81ef1d9300cb024a540e51e9a9702e2880855bfb9ec5b62c033"},"properties":{"dependency":{"package":"vite","version":"7.3.3","advisory":"[GHSA redacted]","aliases":["[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]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"bbd612984b186ad59437ee7cf3cb5f042d5bf6d2793061ce4648d4d0f04c7eed"},"properties":{"dependency":{"package":"@vitest/mocker","version":"4.0.16","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned files with no living knowledge: 19 of 521 analysed file(s) have no living knowledge left \u2014 their last meaningful change has decayed away, so if one breaks, no one currently understands it (counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 521 of the 1359 production source files in this repository met that bar). None is large enough to earn a read-through of its own, so this row stands in for the per-file rows rather than raising one each \u2014 most significant first: vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/Graphemes.kt, src/main/java/com/maddyhome/idea/vim/thinapi/IjJsonExtensionProvider.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/CollectionElementVisitor.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/nfa/NFA.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/TryStatement.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/nfa/matcher/ColumnMatchers.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/nfa/matcher/LineMatchers.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/StringUtil.kt (and 11 more). Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/Graphemes.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17141982fe275ae616c5199fec2d8730fa6794c3f0cc6c7efbf0654200986808"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/thinapi/IjJsonExtensionProvider.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89928e831a00a0d438bd6882185264c294d866561c15a15e69de182c93c984ce"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/CollectionElementVisitor.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"41c98031b578f9e01ba55e86a9c30c19a8a362a0d93779dfb25ea1e5d0bfb1de"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/nfa/NFA.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7133e9301b10dcbe98fe810217f5a7d34e789a9e90347da8f8d4cec90ec604ff"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/statements/TryStatement.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7072be9d15e73d44e90bc3c70d18ece02d395a58a5511b9d1a9ec706720fe7d6"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/SelectionInfo.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8779707deda4737193f52304ca64032a1e5a3e8b639a1170a6949d48e6301096"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/nfa/matcher/ColumnMatchers.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7288addc7a591ccf19f4d6b79ce95e9e579cad6bce352f6bb0f4815165a809a4"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/nfa/matcher/LineMatchers.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88d97de51b5078fee7da22bef6a82b7053ca33cf39b9395fa156ed27bb44deac"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/group/StringUtil.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e267bf8c96fc836032570f43e01fb1844eaafcab238cc48bc684fa0cd622cca"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimCaretBase.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b42dbe7e39cab1a98d3295e7da68423ea79f244f70201d0a1df00d663a8bb73"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/widgets/macro/MacroWidgetFactory.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5cee5cf6d3959ca1718d1262e5e7a89cd5f611c58312adbff17f8da28473872"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/listeners/ModeWidgetListener.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f985e4a4ef216a8431fd5738f69455d04f37a329296502335d5fdfaef82ba1d"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimCommandLineServiceBase.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"78490b4d12fabfc407ac902f1b710bcd979054f54e24b47648b1b68451474c06"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/TabMoveCommand.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"75ae4f53bbfee8ca7222f06bdd424d49bb0020092fb4db4fc40158e7498cf5ab"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/RegisterActions.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d98c567d7c6feb3deed3cd066ff247254c46c944282e0dae650ec4c8532f905e"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"annotation-processors/src/main/kotlin/com/intellij/vim/processors/ExtensionsProcessor.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7adfba158d484b54dd95372e5f145cd0a7a272137e095c3f8b95708603f8d1e1"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/thinapi/IjPluginExtensionsScanner.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c86e1f155469428f667ab04cf1ae1b5172f3d3d24c269c54adbeddd1cb6ac309"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/IdeaPlug.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d0aec2c8a50ee44ffafa310f4db750cede028f6ca254db719c17e356ade7713"}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned file: No one still active in this repository holds living knowledge of this file: everyone who made a meaningful change to it has gone quiet, or what the current team did to it (moves, reformatting, log-level or import edits, renames) never needed understanding it. If it breaks, no one currently understands it. Attach the read to the next change that touches it: have a second person review that change, and leave behind a short comment or test recording what the file is for."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"api/src/main/kotlin/com/intellij/vim/api/scopes/editor/ReadScope.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3c3d766cb27ea0962b201d9adf2f3a567ce9e3f2661d270b4a9ac180e495f5e"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: IjVimApplication.kt \u2194 VimApplication.kt: \u0060src/main/java/com/maddyhome/idea/vim/newapi/IjVimApplication.kt\u0060 (context main) and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimApplication.kt\u0060 (context vim-engine) sit in DIFFERENT parts of the tree yet change together 94% of the time (17 of the 18 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 17 shared commits counted here, the most recent 3 are \u0060852ea2fe\u0060 Fix(VIM-2974): Delete isOctopusEnabled() and octopus-support files; \u0060f9f4c6b1\u0060 add modes test; \u0060437fa9a1\u0060 Remove the root write and read actions \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjVimApplication.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b07320cfae2b6c7fc4d6380e3873f315a2b2064d80d3a9fccb3437ebb97841af"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: IjVimMessages.kt \u2194 VimMessages.kt: \u0060src/main/java/com/maddyhome/idea/vim/newapi/IjVimMessages.kt\u0060 (context main) and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMessages.kt\u0060 (context vim-engine) sit in DIFFERENT parts of the tree yet change together 91% of the time (10 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u0060c9234b82\u0060 VIM-4175 Clear output panel before showing error; \u00605e20bbf1\u0060 VIM-4120 display multiple lines in OutputPanel with different styles; \u006076087fea\u0060 Split host and engine bundles \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjVimMessages.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6565b3d8aa6a1d42b6a32d274cec41446788663148629b24afb1f10b1fd82c"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: ExEditorKit.kt \u2194 InsertCompletedLiteralAction.kt: \u0060src/main/java/com/maddyhome/idea/vim/ui/ex/ExEditorKit.kt\u0060 (context main) and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt\u0060 (context vim-engine) sit in DIFFERENT parts of the tree yet change together 60% of the time (6 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u006015ae069f\u0060 Make keyHandlerState argument not null; \u006043b9ecdf\u0060 Get rid of Editor in KeyHandler.kt (at that commit the file was still \u0060src/main/java/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt\u0060); \u0060ce99c26c\u0060 Introduce ExecutionContext - abstract context holder (at that commit the file was still \u0060src/main/java/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEditorKit.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"40da50827ddf47ad4e020ca4fe728e380b092491b6893e9f9e4ae066e9a71514"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: ExEditorKit.kt \u2194 InsertCompletedDigraphAction.kt: \u0060src/main/java/com/maddyhome/idea/vim/ui/ex/ExEditorKit.kt\u0060 (context main) and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt\u0060 (context vim-engine) sit in DIFFERENT parts of the tree yet change together 60% of the time (6 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u006015ae069f\u0060 Make keyHandlerState argument not null; \u006043b9ecdf\u0060 Get rid of Editor in KeyHandler.kt (at that commit the file was still \u0060src/main/java/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt\u0060); \u0060ce99c26c\u0060 Introduce ExecutionContext - abstract context holder (at that commit the file was still \u0060src/main/java/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/ex/ExEditorKit.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"15b048a84a006067a4dd44d9a96baf54f523a3cfd4738573de21437726965db9"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: IjEditorExecutionContext.kt \u2194 MappingInfo.kt: \u0060src/main/java/com/maddyhome/idea/vim/newapi/IjEditorExecutionContext.kt\u0060 (context main) and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt\u0060 (context vim-engine) sit in DIFFERENT parts of the tree yet change together 50% of the time (9 of the 18 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u0060b66da768\u0060 VIM-3376: Remove usages of the EditorDataContext; \u006047273290\u0060 VIM-3376: Get rid of IjCaretAndEditorExecutionContext; \u00600e96819e\u0060 Update creation of execution context \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/newapi/IjEditorExecutionContext.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ed6178190e31b71681a11ad0f4cba3805d74d0513a37571e007d1cade5e1387"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: MacroGroup.kt \u2194 InsertCompletedLiteralAction.kt: \u0060src/main/java/com/maddyhome/idea/vim/group/MacroGroup.kt\u0060 (context main) and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt\u0060 (context vim-engine) sit in DIFFERENT parts of the tree yet change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u006015ae069f\u0060 Make keyHandlerState argument not null; \u006043b9ecdf\u0060 Get rid of Editor in KeyHandler.kt (at that commit the files were still \u0060src/main/java/com/maddyhome/idea/vim/group/MacroGroup.java\u0060 and \u0060src/main/java/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt\u0060); \u0060ce99c26c\u0060 Introduce ExecutionContext - abstract context holder (at that commit the files were still \u0060src/main/java/com/maddyhome/idea/vim/group/MacroGroup.java\u0060 and \u0060src/main/java/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/MacroGroup.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29589125d15c61841f4c6857c96bc624293d3071c57b903d31469ed5ab51c1d5"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: MacroGroup.kt \u2194 InsertCompletedDigraphAction.kt: \u0060src/main/java/com/maddyhome/idea/vim/group/MacroGroup.kt\u0060 (context main) and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt\u0060 (context vim-engine) sit in DIFFERENT parts of the tree yet change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u006015ae069f\u0060 Make keyHandlerState argument not null; \u006043b9ecdf\u0060 Get rid of Editor in KeyHandler.kt (at that commit the files were still \u0060src/main/java/com/maddyhome/idea/vim/group/MacroGroup.java\u0060 and \u0060src/main/java/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt\u0060); \u0060ce99c26c\u0060 Introduce ExecutionContext - abstract context holder (at that commit the files were still \u0060src/main/java/com/maddyhome/idea/vim/group/MacroGroup.java\u0060 and \u0060src/main/java/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/MacroGroup.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"106448f556415125099cdd151c38d0fb37c8be12ebcdd2a8586e60d528c72cb1"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: LetCommand.kt \u2194 OptionExpression.kt: \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/LetCommand.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/OptionExpression.kt\u0060 change together 91% of the time (10 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u0060fd1fe516\u0060 Extract indexed expression assignment; \u0060dc5b45a5\u0060 Update OptionExpression to match Vim behaviour; \u0060063317b0\u0060 Introduce LValueExpression, update OptionExpression \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/LetCommand.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"82741ba17720d3a033cc6c760618ae9e0f2e072243a811b60e00d4f61546936a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ExCommandProcessor.kt \u2194 VimscriptFunctionProcessor.kt: \u0060annotation-processors/src/main/kotlin/com/intellij/vim/processors/ExCommandProcessor.kt\u0060 and \u0060annotation-processors/src/main/kotlin/com/intellij/vim/processors/VimscriptFunctionProcessor.kt\u0060 change together 73% of the time (8 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets). They sit in the same directory, and in this ecosystem sibling files there normally share one namespace/package \u2014 so a direct reference between them needs no import and this pass cannot see whether one exists. Read the pair before acting: if one file only DECLARES what the other consumes (a constants/types file beside its user), the co-change is definitional and the question is whether the split earns its keep; if they duplicate structure, extract the common part into a shared function or type they both call; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u0060b005328b\u0060 Exclude generated files from .gitignore; \u006093c83f77\u0060 Add generated JSON files to gitignore; \u006091191526\u0060 Inline the writeFile function \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"annotation-processors/src/main/kotlin/com/intellij/vim/processors/ExCommandProcessor.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5b902df91cad0b11ccac7eddf72ac0bebfcdaf3d924e143ea66cd4a609f542b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: IdeaSelectionControl.kt \u2194 IdeaRefactorModeHelper.kt: \u0060src/main/java/com/maddyhome/idea/vim/group/visual/IdeaSelectionControl.kt\u0060 and \u0060src/main/java/com/maddyhome/idea/vim/vimscript/model/options/helpers/IdeaRefactorModeHelper.kt\u0060 change together 69% of the time (11 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 11 shared commits counted here, the most recent 3 are \u00606b7b18d9\u0060 Switch to Normal when accepting an inline rename; \u0060aa539e76\u0060 Rename RWLockLabel to VimLockLabel and other annotations; \u0060f88a1cbe\u0060 Add more wrappings for read actions \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/visual/IdeaSelectionControl.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bc3b18ba0e2c4096fa1f0474e41936d85257064045bf757279c51c0a44384ec"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: ThinApi.kt \u2192 VimApiImpl.kt, EditorAccessorImpl.kt, TransactionImpl.kt: \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/ThinApi.kt\u0060 changes together with 3 other files \u2014 \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/VimApiImpl.kt\u0060, \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/EditorAccessorImpl.kt\u0060, \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/TransactionImpl.kt\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/ThinApi.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc2986e3065445a55f08c040bee1196e2d18200a9f819212c0dd90fbbd4fa049"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: MappingInfo.kt \u2194 EditFileCommand.kt: \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/EditFileCommand.kt\u0060 change together 58% of the time (7 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060560700c9\u0060 Pass editor to the execution of the action; \u0060b66da768\u0060 VIM-3376: Remove usages of the EditorDataContext; \u00600e96819e\u0060 Update creation of execution context \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59ee7eea93f24b424a27d9ff1630b58e6ef0747dfcd315735af914309edc3f44"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: PropertyBased.kt \u2192 LongRunning.kt, Nvim.kt, TestingBuildType.kt: \u0060.teamcity/_Self/buildTypes/PropertyBased.kt\u0060 changes together with 3 other files \u2014 \u0060.teamcity/_Self/buildTypes/LongRunning.kt\u0060, \u0060.teamcity/_Self/buildTypes/Nvim.kt\u0060, \u0060.teamcity/_Self/buildTypes/TestingBuildType.kt\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".teamcity/_Self/buildTypes/PropertyBased.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"347731b073c85ab310fe6a45ddf86e1c53ee0cfafcb217d989ff1a033476e29a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: VimPutBase.kt \u2194 PutLinesCommand.kt: \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/PutLinesCommand.kt\u0060 change together 55% of the time (6 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u0060c74e7671\u0060 VIM-1025 Add control chars editor; \u0060ad85aca8\u0060 VIM-1595 Add support for handling address 0 in \u0060:put\u0060 command; \u006025e3988d\u0060 Introduce VimCopiedText class \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/put/VimPutBase.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9094a9a9f537d0e105f4dcacd8a157c021ba57613965a865db71b53fed78ffe"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: BacktrackingStrategy.kt \u2194 MultiVisitor.kt: \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/strategies/BacktrackingStrategy.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/parser/visitors/MultiVisitor.kt\u0060 change together 53% of the time (9 of the 17 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u00604ac98710\u0060 implement limit lookbehinds (at that commit the file was still \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/nfa/NFA.kt\u0060); \u0060ca94d55b\u0060 implementing negative lookbehind (at that commit the file was still \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/nfa/NFA.kt\u0060); \u00604bba791c\u0060 adding comments and small cleanups (at that commit the file was still \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/nfa/NFA.kt\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/regexp/engine/strategies/BacktrackingStrategy.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"542e213543f52b31d0a8c9c8d6aa13a17ecd2f53ea59203c2cc3ff5d38f7c829"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling clique: MiniAI.kt, ParagraphMotion.kt, VimIndentObject.kt: 3 files \u2014 \u0060src/main/java/com/maddyhome/idea/vim/extension/miniai/MiniAI.kt\u0060, \u0060src/main/java/com/maddyhome/idea/vim/extension/paragraphmotion/ParagraphMotion.kt\u0060, \u0060src/main/java/com/maddyhome/idea/vim/extension/textobjindent/VimIndentObject.kt\u0060 \u2014 all change together with no explicit dependency: a fully-connected co-change clique, not 3 separate couplings. They share one concern (thin parallel siblings over a common abstraction), so extract the shared part into ONE unit and the whole clique\u0027s coupling clears at once \u2014 you do not need to break each pair individually."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/extension/miniai/MiniAI.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b339bb3cb7f2d8801baeccf07d6685c5d0778b56ca90acee2f5f2c11a856c904"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: EditorAccessorImpl.kt \u2194 CaretReadImpl.kt: \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/EditorAccessorImpl.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/caret/CaretReadImpl.kt\u0060 change together 52% of the time (13 of the 25 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 13 shared commits counted here, the most recent 3 are \u0060c5f6b2e3\u0060 Add insert big word at cursor command line action (at that commit the file was still \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/ReadImpl.kt\u0060); \u00609d92ae94\u0060 Remove the suspend from functions under the read or write actions (at that commit the file was still \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/ReadImpl.kt\u0060); \u006002a9d284\u0060 repackage files (at that commit the file was still \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/ReadImpl.kt\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/EditorAccessorImpl.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a9f5397606573bdec7765db5bfe47a6b12eb48ee28a823054672de15aa1d460"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: CaretRead.kt \u2194 EditorAccessorImpl.kt: \u0060api/src/main/kotlin/com/intellij/vim/api/scopes/editor/caret/CaretRead.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/EditorAccessorImpl.kt\u0060 change together 50% of the time (9 of the 18 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u0060c5f6b2e3\u0060 Add insert big word at cursor command line action (at that commit the file was still \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/ReadImpl.kt\u0060); \u00609d92ae94\u0060 Remove the suspend from functions under the read or write actions (at that commit the file was still \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/editor/ReadImpl.kt\u0060); \u00609a79cdc3\u0060 add functions from vim search helper (at that commit the files were still \u0060api/src/main/kotlin/com/intellij/vim/api/scopes/caret/CaretRead.kt\u0060 and \u0060vim-engine/src/main/kotlin/com/maddyhome/idea/vim/thinapi/ReadImpl.kt\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"api/src/main/kotlin/com/intellij/vim/api/scopes/editor/caret/CaretRead.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ea710f7f4c62b6d9f20b608fabc61ff63c03fb2d9c73eafeb1b14fc129b7d20"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: VimPluginToggleAction.kt \u2194 StatusBar.kt: \u0060src/main/java/com/maddyhome/idea/vim/action/VimPluginToggleAction.kt\u0060 and \u0060src/main/java/com/maddyhome/idea/vim/ui/StatusBar.kt\u0060 change together 50% of the time (7 of the 14 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u006058a8b96c\u0060 Revert \u0022Stop IdeaVim actions flowing into JB Client\u0022; \u0060bd192561\u0060 Stop IdeaVim actions flowing into JB Client; \u00606711f1db\u0060 Specify update thread for actions \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/action/VimPluginToggleAction.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"06c0ff78b2b65aafa9c58586fced98be66cbf08219d6ecdae0e8c3cbb2173c53"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: LongRunning.kt \u2194 TestingBuildType.kt: \u0060.teamcity/_Self/buildTypes/LongRunning.kt\u0060 and \u0060.teamcity/_Self/buildTypes/TestingBuildType.kt\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets). They sit in the same directory, and in this ecosystem sibling files there normally share one namespace/package \u2014 so a direct reference between them needs no import and this pass cannot see whether one exists. Read the pair before acting: if one file only DECLARES what the other consumes (a constants/types file beside its user), the co-change is definitional and the question is whether the split earns its keep; if they duplicate structure, extract the common part into a shared function or type they both call; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u00602cb5e5b6\u0060 VIM-4234 Rollback to java 21; \u00604225b32f\u0060 Update java to version 25; \u006019354440\u0060 Remove clean task from TeamCity builds to enable Gradle caching \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":".teamcity/_Self/buildTypes/LongRunning.kt"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4677d695bff8a822a16d85bbc9b59640a6c8f6a6ca9edb77f4e2c62b18b008f7"}},{"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":"0e17f71490e4d120a48b2b2881ab866c93b272bef2febb673a3e8e42b2c288ab"},"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":"d4556e77552d49267e16a5912bdbb45da67f96fabcf050e458cc6474bf8a20f2"}},{"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":"6d978b75b52b77689c6756e72f075a80bfcef9e45966fc11d0e328ee91fba56f"},"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":"a13b7cac9cbd2a9bad1477613a65803764e36a95fe8add202c09a558848726d0"},"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":"6aa7a517a5972d3c88d5f2cefd2acfcda025a4941279dcf9330391f5e1227c26"},"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":"ff2d78628a6128ca52485719f5c5bc6182e7caf369281a30f7fa3a5cc5474dad"},"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":"40f9690f17af6346c2f5a0439c47249fb0410f0f1457311871171f233b34d037"},"taxa":[{"id":"CICD-SEC-4","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":"9734b3f88fed7cdee31c12fae3590d8124701eced86612e6aa45cac9bc7e6d14"},"taxa":[{"id":"CICD-SEC-4","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":"18d8cf8a9200dff8153f8a3039d3c8d6022a609c3313cfd78e517ad26bf17218"},"taxa":[{"id":"CICD-SEC-5","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-common/src/main/resources/inspectionDescriptions/UsePlug.html"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b335a551f74a3db9336322808e9ca3589233cd1179bbd7c43d874b92eec638d6"}},{"ruleId":"AC3","level":"error","message":{"text":"Document without a \u003Ctitle\u003E: A page with no \u003Ctitle\u003E gives no name in the tab, history or screen-reader page list. Add a descriptive \u003Ctitle\u003E in \u003Chead\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-common/src/main/resources/inspectionDescriptions/UsePlug.html"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d28d02860d6405c93d035cdb9848cb8f948834f151b037e54948ea7bcc5cc53"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-common/src/main/resources/inspectionDescriptions/UsePlug.html"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"ced3602479cf4e02c7d1801d5d94f8dc9f1a676e238b90e37daa1e2c9b5f5725"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-common/src/main/resources/inspectionDescriptions/UsePlugSyntax.html"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"9abb26d2108e7f212ae3a0727d744b6feea697c1131c4401c8bfbe681de0ecb8"}},{"ruleId":"AC3","level":"error","message":{"text":"Document without a \u003Ctitle\u003E: A page with no \u003Ctitle\u003E gives no name in the tab, history or screen-reader page list. Add a descriptive \u003Ctitle\u003E in \u003Chead\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-common/src/main/resources/inspectionDescriptions/UsePlugSyntax.html"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"706c7d0db09773cf55e9e4e79db2ee929a22e881e305b64e2eb061cc533669ba"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-common/src/main/resources/inspectionDescriptions/UsePlugSyntax.html"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6e59b4ca8c9259f8266a184798501f4bc0df583022c1307b580e6496ac339a4"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.40.0.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0e1106613f5a9f6f6c8c6511ebd2fbbe956fa523f8653175247bc7145a984a7"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.41.0.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"58f89e2bc9c7348604145849a4e98f98490462ea589b6c4e797fbbedffce23f9"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.42.0.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f44ebf54cc2df498a2625fa04f23ac113fb511f26f2b86faf6fcb295a0a9b85"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.43.0.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"803a55e2cb2931a30351ec64d8f46decf4a6583c51fa54ea3cd5e53b599540d9"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.44.0.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"e625704ae76d1a5c8c61959e09e14d210350fc98d98855cc26df90508f05c152"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.44.1.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf17feaeaed6217833de544cf8d3767e264c75a11dd8add4547460c8afea804"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.45.0.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"182d11b76d6370746c622c81ea0cddd2b472348c0456ad22415d579cd9c08024"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.45.1.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"13430390e17e66b6013d0a8e18ce556fd6df4ddbc377eb4197aa164fed18b145"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.45.2.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cfa9125aac27b7ed85d2be4f072c1cd3afc36726353d63a88027de6c8e54942"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.46.0.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"416e92dc508bfb8c01dbbe944cc857d0841d86cf60180740ab9b020c8f2b0f0e"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.46.1.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"30970410987d55236914022def61714054d8bf9f25d060d73e309fb8eeff9b0a"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.46.2.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0c345e82fa60eed283fbd2c01c7503f626f6137c694b4827e93821342f7e509"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.47.0.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"631a0fdfa2602b7265ac003c49d85af045c816b71fcbff8c7a9ccc7b40925db5"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.47.1.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6beb41518331f04a7f474bb03400f330118b6793f96db504ccd0a606db267bb"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/whatsnew-2.47.2.html"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"edcbc65cf5a6a0724fbe782ac82e2433b9ad687563ac0cefc9ba54ef9773d7bd"}},{"ruleId":"AC7","level":"warning","message":{"text":"Accessibility enforcement below the top rung: No accessibility enforcement found \u2014 no accessibility linting at author time and no automated accessibility check in tests or CI. Add your UI toolkit\u0027s own accessibility assertion to the test suite (Flutter \u0060meetsGuideline\u0060, Espresso \u0060AccessibilityChecks\u0060, XCTest \u0060performAccessibilityAudit\u0060), then gate that test in the pipeline. What was searched, so you can tell an absence from a miss: the 17 markup file(s) this pass actually assessed, the linter configuration checked in beside them, and this repository\u0027s test and CI files \u2014 matched by name against the accessibility checkers this dimension carries. An audit run outside the repository, a hosted scanner, or a check whose name is not one of those, is not seen here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d46019b86eff5ddad9db289e6802ac158899e980df54c34f67722442787ead62"}},{"ruleId":"AX3","level":"error","message":{"text":"Project dependency cycle: The projects :ideavim-acejump \u2192 IdeaVIM \u2192 :ideavim-acejump (one cycle inside a mutually-dependent group of 9 projects) form a reference cycle. Cyclic dependencies prevent independent build/test/deploy, blur ownership, and tend to grow into a big ball of mud. Break the cycle by extracting the shared types into a separate project both can reference."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"06ab53bf48f900cd058c3a245e9d464fe90285845f653aa8b4930ed0ff055650"}},{"ruleId":"AX4","level":"error","message":{"text":"Dependency-rule violation: :ideavim-backend-bookmarks-core (Domain) \u2192 :api (Web): \u0060:ideavim-backend-bookmarks-core\u0060 is a Domain project but references \u0060:api\u0060, a Web project. The clean-architecture rule is that dependencies point INWARD \u2014 the domain/application core must not depend on outer layers (infrastructure/web). Invert it: define the abstraction in the inner layer and implement it in the outer one."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"2eb88953444a5ac8b3823cf7731f7511c8dbd6e52fb4fd849560457d5f9c39fb"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: CONTRIBUTING.md links to \u0060src/main/resources/ksp-generated/intellij_commands.json\u0060, but \u0060src/main/resources/ksp-generated/intellij_commands.json\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":"CONTRIBUTING.md"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec0d68db0387ae34f59d891f3ba2f4fd35cbad22ed3d7e1991826796412c0271"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: CONTRIBUTING.md links to \u0060src/main/resources/ksp-generated/intellij_ex_commands.json\u0060, but \u0060src/main/resources/ksp-generated/intellij_ex_commands.json\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":"CONTRIBUTING.md"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"386aa0f2baefae7285caf8a90e8891bc08340f9809eb89f543bb7de843cdfcb2"}},{"ruleId":"M4","level":"note","message":{"text":"README/code drift: api/doc/Plugin-API-introduction.md links to \u0060IdeaVim%20Plugins.md\u0060, but \u0060api/doc/IdeaVim Plugins.md\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":"api/doc/Plugin-API-introduction.md"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdf799d9db3277937eaec5a4845bffdbad4f67145a7a6f3ebc9f9d41bd8dadf7"}},{"ruleId":"P10","level":"note","message":{"text":"Large public API surface: 1566/1885 types (83%) declared in the published library are public. For a library, every public type is a stability contract \u2014 keep implementation types off the surface and expose only the intended API."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ed2ba843444ae377c17142f58f714e281e4bd3f183ab100ee1fbef389875d3e6"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060writeFileSync\u0060 in \u0060downloadAttachment\u0060 blocks the event loop until it finishes \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/tools/youtrack.ts"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a507218ee4169c3403d1626f72845df3d06846ae034883533da304077991939"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060readFileSync\u0060 in \u0060main\u0060 blocks the event loop until it finishes \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/updateAuthors.ts"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a3760286cf7cda242658086f9315fca913b006cae6525aae032a75190012bcf"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060writeFileSync\u0060 in \u0060main\u0060 blocks the event loop until it finishes \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/updateAuthors.ts"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eb315c33795932d48c80631793eb11c1600e0c7f36659aea57d2541b851b989"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (30 matched lines \u00D7 2 locations): scripts-ts/src/selectIssueWithoutArea.ts:22 \u00B7 scripts-ts/src/selectTicketForAnalysis.ts:16 \u2014 the two spans are one implementation copied and then locally edited \u2014 220 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/selectIssueWithoutArea.ts"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"8001c0e396c0bedfb3aed8cb7432a57d6edebf86f56edc659bf5a974f42d2fce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): scripts-ts/src/tools/youtrack.ts:161 \u00B7 scripts-ts/src/tools/youtrack.ts:314 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/tools/youtrack.ts"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"358c90578d95928cccb24598ff9818a8dd275b81d1c287c9da7dfaeb868d6627"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): scripts-ts/src/youtrack-cli/set-fix-version.ts:17 \u00B7 scripts-ts/src/youtrack-cli/set-status.ts:18 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/set-fix-version.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcfceccf646f590fa0dbb36e052268b405e990aef3ee0ed52475545496c22138"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): scripts-ts/src/youtrack-cli/add-tag.ts:26 \u00B7 scripts-ts/src/youtrack-cli/remove-tag.ts:22 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/add-tag.ts"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"7709087ae1a2d2876ededd72abfee74a934f266000d41f5e1b4240a2bc80d47a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): scripts-ts/src/youtrack-cli/remove-tag.ts:31 \u00B7 scripts-ts/src/youtrack-cli/set-fix-version.ts:21 \u00B7 scripts-ts/src/youtrack-cli/set-status.ts:22 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/remove-tag.ts"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaedd5acabf98929f52f0820b5f856e31e4018c25e533904e8d6380bcb403774"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): scripts-ts/src/prepareReleaseChangelog.ts:57 \u00B7 scripts-ts/src/syncChangelogToMaster.ts:60 \u2014 the two spans are one implementation copied and then locally edited \u2014 68 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/prepareReleaseChangelog.ts"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e55910b8ea1576a4adf14e24401256f4cf22f145feb1bc588445506deef25f4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): scripts-ts/src/tools/youtrack.ts:110 \u00B7 scripts-ts/src/tools/youtrack.ts:127 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/tools/youtrack.ts"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea1355c1e98be426b35545bd1a67338a871ae1b54d53e26b1f490d949a0397e6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): scripts-ts/src/updateAuthors.ts:40 \u00B7 scripts-ts/src/updateYoutrackOnCommit.ts:22 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/updateAuthors.ts"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"638f11e843b9ccc5b3e408f1a26b9e9752ed37acef0bb1d9603fafe62a8b8fb6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (10 matched lines \u00D7 2 locations): scripts-ts/src/promoteChangelog.ts:52 \u00B7 scripts-ts/src/releaseActions.ts:52 \u2014 the two spans are one implementation copied and then locally edited \u2014 64 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/promoteChangelog.ts"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"56fb163a4d286c84a5542654c6f21bcaf58f11a9cb257c104ed35e1f60d6b802"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): scripts-ts/src/youtrack-cli/create-version.ts:17 \u00B7 scripts-ts/src/youtrack-cli/delete-version.ts:19 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/create-version.ts"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"30e9ae339b2324c6a994d151773d7294e4a59de827a8c0c70fe97d1d710f427a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): scripts-ts/src/syncChangelogToMaster.ts:103 \u00B7 scripts-ts/src/syncChangelogToMaster.ts:119 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/syncChangelogToMaster.ts"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"68b80561231a307d5af178cfecea92bbddcbfb1b756b3dbba9deafb25dd89f73"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): scripts-ts/src/tools/youtrack.ts:92 \u00B7 scripts-ts/src/tools/youtrack.ts:499 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/tools/youtrack.ts"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e1fddf4e300e72097e38a91ff3d316f59874708599164a9012fb30e480578a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): scripts-ts/src/updateAuthors.ts:115 \u00B7 scripts-ts/src/updateAuthors.ts:125 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/updateAuthors.ts"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"abe55cca5292a7f460a1ce80a75762a1f042e2fe4533e1e3998225246a66466a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): scripts-ts/src/collectPropertyTestFailures.ts:82 \u00B7 scripts-ts/src/updateAuthors.ts:230 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/collectPropertyTestFailures.ts"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"155c4307bb80c89aaf4cc3d47d744a3ad8aa450bec05e1c4a2af9fbefc4e2a6f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): scripts-ts/src/selectTicketForAnalysis.ts:16 \u00B7 scripts-ts/src/updateAuthors.ts:230 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/selectTicketForAnalysis.ts"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4419db31f2d56876b432af18d5e345f1b37ebcef1c8304c3177bd87d8f810d7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): scripts-ts/src/youtrack-cli/add-comment.ts:18 \u00B7 scripts-ts/src/youtrack-cli/get-ticket.ts:18 \u00B7 scripts-ts/src/youtrack-cli/set-area.ts:21 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/add-comment.ts"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7aec1f8ab50c7cf506f847b7a45ccbd90d3feaa86f6fd45c64e29cb02756476"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): scripts-ts/src/updateAuthors.ts:237 \u00B7 scripts-ts/src/updateYoutrackOnCommit.ts:58 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/updateAuthors.ts"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"075c8ae58f51cd809d28e73533e868cb9cd370de19666d218c40a60eb79751b7"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 14, cognitive 27): main has cyclomatic complexity 14 and cognitive complexity 27; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/selectTicketForAnalysis.ts"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"33c24c61a87f0f76290cb1b735de9806eb78d801ee3d66a84dd9cb56a08f1977"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function unreleasedEntries (cyclomatic 13, cognitive 16): unreleasedEntries has cyclomatic complexity 13 and cognitive complexity 16; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/syncChangelogToMaster.ts"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"76461c28c569481b77c2592e30e5a34363f86091edf2b0ee9a0b9b996c178e76"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function parseFailureDetails (cyclomatic 12, cognitive 12): parseFailureDetails has cyclomatic complexity 12 and cognitive complexity 12; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/propertyTestFailures.ts"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"19c7e579d21eaff0c6e00eb385bfe979a35046b3810b166da78cd41c5bbeff0a"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function main (cyclomatic 11, cognitive 12): main has cyclomatic complexity 11 and cognitive complexity 12; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/completeTicketAnalysis.ts"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"386c565b16714111ab1d531a7a54284fdf1719562b1484e4d2095ab9ab1dda86"}},{"ruleId":"R3","level":"warning","message":{"text":"scripts-ts/src/tools/youtrack.ts: 465 lines of code: scripts-ts/src/tools/youtrack.ts has 465 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/tools/youtrack.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af4a2d2a4905ccde2a1bb5cddc347fa20413b3d4680bc23877191dae60ac72f5"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/collectPropertyTestFailures.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b94125a5904d031be6a2dd060984a1fdd8aeab0a53affccb4de971e8a61ebe19"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/selectTicketForAnalysis.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b903e2d4b5180e4e8ddcc52236e3f196c39b580fc898c1afbcc6ec121964bb01"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/completeTicketAnalysis.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f02b7cc46303de5fcfef0eb34d076774202f96b61b84fdf00a7a32b88422912"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/checkNewPluginDependencies.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad64831f997f100904c1df7374d0f23387bc2de70712f6469e5f889f91f6aefc"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/updateYoutrackOnCommit.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f23b2a971eeecb24d9d134da8275a4bf82987b398f1b7d6a8d3f765adca6f4"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/selectIssueWithoutArea.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52f98d10deda587f795edc174e42ad101fcd371c96edb1705ce8054b76c92dc9"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/add-tag.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"125ef24ae930d801e338c2639cce5fd4918dc7c23a3ddf7d0e46a0112f3e2b4f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/get-ticket.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4d8803bc26cf756595f9efe9fccf913ef72a10997b684e4e8a7e51805297a28"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/search-tickets.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f446cc47fd089be7c2cdd330aa5bb3ee7261b10df98c14dccad34e2f57cbd77a"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/remove-tag.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"21c16adb1f96841063d6c0a72574e2c8790ef94b19fd0fb528b083be1be9d541"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/add-comment.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b88b7b41a599580ea7b6572de89554dddc4f18868471efb41e91266341e3e0bf"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/delete-version.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"87f6dc6d241202c0c3691fe8f650f30dce863be2aa94ff440556f847ca7dd0ef"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/set-area.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e240c93bc53544540ce78d4d4bdc7c464b6d8a369a3d0ffc8cf71e1acd32fec"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/get-area-values.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c03043b8786f84c5338a40e6d7a5f4b24db511b747567def5fb7d6ed63e8a531"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/setTeamCityBuildNumber.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"71ae584bf2fb746e6c48c65b42be661f4e5c0225fa6dda28d18e21d50d463e78"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/create-version.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdd6b42ee80e541d49959fc28c81b792b62d5a8e89032da127ac3b3449e2c6fc"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/set-status.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45eb1f2182ab2f8e79972b6682db39ff5262dbc1217a91a7c62f16550dbe9d5f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/youtrack-cli/set-fix-version.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99ea8b92a9fad368d0fee38c9348102317648843bf383c9054fad832a9092305"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/eapReleaseActions.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b43d1784f57f797adb7374c73f1b5461aa8ef03f04d9a529db51cc0cff89cdf3"}},{"ruleId":"R6","level":"warning","message":{"text":"No lint script: test \u2713 \u00B7 lint \u2717 \u00B7 typecheck \u2713 \u2014 read from this repository\u0027s package.json scripts and corroborated against its CI workflows. A script counts when its name or command matches the step: \u0060test\u0060 for the suite, \u0060lint\u0060 or \u0060prettier\u0060 for linting, \u0060typecheck\u0060/\u0060type-check\u0060/\u0060tsc\u0060 for type checking. \u2717 therefore means no script or CI step under those names was found, NOT that the step is absent from your pipeline \u2014 a task invoked by a runner this check does not read, or named something else entirely, is not seen and is worth confirming before acting on a cross. A \u2713 means the wiring is DECLARED \u2014 a script or CI step under those names exists. It is not a statement that the step passes, or that it runs at all: nothing here installs a dependency or executes a suite."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bc8e67e81453cf5399dd04786d18b232180426b135169175fee670bdd83ccb03"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060OptionConstants.keymodel_stopsel in keymodel || OptionConstants.keymodel_stopselect in keymodel\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowLeftAction.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowRightAction.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionArrowLeftAction.kt"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"720e64ba3ce6eb79e0f888d7c5668e8bc58ec85c1b4a785a9781dfb01dd99311"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060action is MotionActionHandler \u0026\u0026 action.motionType === MotionType.EXCLUSIVE \u0026\u0026 isForwardMotion\u0060 appears character-identically in 2 files \u2014 src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMotionGroupBase.kt. 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":"src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"0288a7d03bbabc3245f54360919cefe721fc16a634e688fec6cc6b83255a77da"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060argument == null || argument !is Argument.Motion\u0060 appears character-identically in 3 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerMotionAction.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleMotionAction.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperMotionAction.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerMotionAction.kt"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6d09973d8017aefb10dcf60888f486aae471b8427dbfb9d68facdfa268cd362"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060caret.offset == 0 \u0026\u0026 count \u003C 0 || caret.offset \u003E= editor.fileSize() - 1 \u0026\u0026 count \u003E 0\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSectionAction.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordEndAction.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSectionAction.kt"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccc9d7dee705ebcbb4008c917928464829e2a8f983b5ea3c211bfc74029848a2"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060caret.offset == lineEnd \u0026\u0026 lineEnd != lineStart\u0060 appears character-identically in 2 files \u2014 src/main/java/com/maddyhome/idea/vim/group/visual/VisualGroup.kt, src/main/java/com/maddyhome/idea/vim/listener/VimListenerManager.kt. 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":"src/main/java/com/maddyhome/idea/vim/group/visual/VisualGroup.kt"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ace7f47fd18a31098f624e6101cfd88fa7992d111210b8373875f819ea9fc3c"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060cmd.startsWith(it.prefix) \u0026\u0026 it.bang == bang\u0060 appears character-identically in 3 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapClearCommand.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapCommand.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/UnMapCommand.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/mapping/MapClearCommand.kt"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"36588b16fbc135547d7f5c1890e03e16a48c3dfd84f15b2fa8d03020e99a4b32"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060completion != null \u0026\u0026 completion.expectedText == commandLine.text \u0026\u0026 injector.globalOptions().wildmenu\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/ex/MoveCaretLeftAction.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/ex/MoveCaretRightAction.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/ex/MoveCaretLeftAction.kt"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9eda3427516c1e5cf45f3fe1ce6c27a9c5d1364852a99e5ecff28397e23fc57"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060editor.inVisualMode || editor.inSelectMode\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionEndAction.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftEndAction.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionEndAction.kt"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"a38436abc74c54c6a62fa3652f8d4ad1206eb99a9a3f850c1c134fe65ab062bc"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060editor.usesVirtualSpace || editor.isEndAllowed\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowRightAction.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowRightAction.kt"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1841af384f0a9c2a8e349a3132c53cdd7dbd4d2ea94cc0e7a8e41b490a25b97"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060handler is DefinedFunctionHandler \u0026\u0026 handler.function.flags.contains(FunctionFlag.DICT)\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimFuncref.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/expressions/NamedFunctionCallExpression.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/datatypes/VimFuncref.kt"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e0c720790ee0cf398d81c8a5f6e4a9ec1ccf7e88eb9902e88a8c3fcc911afda"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060inlay != null \u0026\u0026 !inlay.isRelatedToPrecedingText\u0060 appears character-identically in 2 files \u2014 src/main/java/com/maddyhome/idea/vim/group/ScrollGroup.kt, src/main/java/com/maddyhome/idea/vim/helper/EditorHelper.kt. 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":"src/main/java/com/maddyhome/idea/vim/group/ScrollGroup.kt"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"113d56410cf6407cfc428b2235b4b8cc9cd3ccece2ffb52f6854f2f9f6fb8dff"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060isNotEmpty() \u0026\u0026 (ctrl != null || previousIsCtrl)\u0060 appears character-identically in 2 files \u2014 scripts/src/main/kotlin/scripts/help/generateHelp.kt, src/main/java/com/maddyhome/idea/vim/vimscript/model/commands/HelpCommand.kt. 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":"scripts/src/main/kotlin/scripts/help/generateHelp.kt"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"38b4a5d6c584a45cf7000d905a8a3f3bcf55a2ad8e51e5ef5218dd0c4d359715"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060key.keyCode == KeyEvent.VK_V || key.keyCode == KeyEvent.VK_Q\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/consumers/ForcedMotionConsumer.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/DigraphSequence.kt"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a914d67b0adf145bebd4a99edb168652f1045d725aa572f61eff0f3cb113ee6"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060mode is Mode.VISUAL \u0026\u0026 mode.isSelectPending\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimVisualMotionGroupBase.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/helper/EngineModeExtensions.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimVisualMotionGroupBase.kt"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b981f56f356dd27599d1646d2181dc85e75229d1abc9936811ba4bbcebde38"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060mode is Mode.VISUAL || mode is Mode.SELECT\u0060 appears character-identically in 2 files \u2014 vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/VimRedoBuffer.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimVisualMotionGroupBase.kt. 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":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/VimRedoBuffer.kt"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"21da16b631d4e6dbee70a4f34d256307ff7cefdf8265513d5eed563eef00ec14"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060part.length != 5 || !part.startsWith(\u0022\u003CC-\u0022, ignoreCase = true) || !part.endsWith(\u0027\u003E\u0027)\u0060 appears character-identically in 2 files \u2014 scripts/src/main/kotlin/scripts/help/generateHelp.kt, src/main/java/com/maddyhome/idea/vim/vimscript/model/commands/HelpCommand.kt. 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":"scripts/src/main/kotlin/scripts/help/generateHelp.kt"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5e82c2f1e8631315bc34f1cc80e032fc6d734490298d7e64538a32d6ed5bc70"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060storedValue is OptionValue.Default \u0026\u0026 storedValue.value != option.unsetValue\u0060 appears character-identically in 2 files \u2014 src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt, vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimOptionGroupBase.kt. 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":"src/main/java/com/maddyhome/idea/vim/group/OptionGroup.kt"},"region":{"startLine":1108}}}],"partialFingerprints":{"codehealthFindingId/v1":"93aad52fd5668883ac6172e8cdf0e4a54bb735fa80fae168cd60f396ef20a05e"}},{"ruleId":"X2","level":"note","message":{"text":"Not all functions that make a request accept an AbortSignal or the coroutine\u0027s cancellation: Only 10/14 functions that make a cancellable request (fetch, axios, ky, ofetch; Ktor, OkHttp newCall, URL streams) accept an AbortSignal or the coroutine\u0027s cancellation or pass one on, so a request keeps running after whatever wanted it has given up \u2014 a page navigated away from, a cancelled request, a shutdown, an expired deadline. Take a \u0060signal\u0060 () and hand it to the request; in a Kotlin suspend function, make the request with a call that suspends \u2014 Ktor, OkHttp\u0027s \u0060executeAsync()\u0060, or a \u0060suspendCancellableCoroutine\u0060 that cancels the \u0060Call\u0060 \u2014 not a blocking \u0060execute()\u0060: \u0060withContext(Dispatchers.IO)\u0060 moves the call off the caller\u0027s thread but does not make it cancellable; where nothing could ever cancel the call, omitting it is a deliberate choice \u2014 judge against how the function is used."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"21eeee9e423271c6ca8c1585dbd13becefdff0bcb29bcd0381c3b54ed97e04fd"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: getGitHubAuthorInfo: \u0060getGitHubAuthorInfo\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/updateAuthors.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1e3233bdd08cd62debc261bcaabf92ca5e5be98c73fa4d3cd37ce2d16e242cb"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: getPluginLinkByXmlId: \u0060getPluginLinkByXmlId\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/checkNewPluginDependencies.ts"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"73a6d38e9d656fd88d1c6003c1273020e13a78d388cbd243e3273c3e92ac53f7"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: downloadAttachment: \u0060downloadAttachment\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/tools/youtrack.ts"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a4576dd37e19da8a2a567f3d5da718cd37be0a8507b008b690c95503cfd391e"}},{"ruleId":"X2","level":"warning","message":{"text":"Async function without AbortSignal: tcGet: \u0060tcGet\u0060 awaits \u0060fetch(\u2026)\u0060 but neither accepts an AbortSignal nor passes one on, so its caller cannot stop the request once it has started. Accept \u0060{ signal }\u0060 and pass it through: \u0060fetch(url, { signal })\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts-ts/src/tools/teamcity.ts"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b26b22a272afda2b2d3ea8d99f1019a035e728ae2bff7b300905870743d474"}},{"ruleId":"X23","level":"note","message":{"text":"Diagnostic log message is built whether or not it is wanted: \u0060debug\u0060 at line 42 is called with an argument built by \u0060extensionBeans.joinToString(\u0022\u2026\u0022)\u0060 (line 43), whose cost grows with the collection it walks. Kotlin evaluates a call\u0027s arguments BEFORE entering the method, so that join/projection runs in full every time this line is reached \u2014 and then the level check inside the logger discards the string it produced, because debug is a level a shipped configuration normally leaves off. Nothing here decides beforehand whether the message is wanted: no \u0060isDebugEnabled\u0060 test, no \u0060BuildConfig.DEBUG\u0060 flag, no trailing lambda (\u0060logger.debug { \u2026 }\u0060) the logger calls only when the level is on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/thinapi/IjPluginExtensionsScanner.kt"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ffc51df03002a16e3614b71887370776ee820ae468f97b986f76f83dd8a9153"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_: Throwable)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-backend-bookmarks/src/main/java/com/maddyhome/idea/vim/group/bookmark/BookmarkRemoteApiProvider.kt"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cabb5d2863fe5ae1358b576d6dbef6e7f871df01fb99bb00678a44a3b0d9cc9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_: Exception)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"ideavim-backend/src/main/java/com/maddyhome/idea/vim/group/process/ProcessGroup.kt"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"71210310c5caf01a1b4bf5c39d7c13357a2bb59e79ae995ff328e82d8c07c03d"}},{"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":"scripts-ts/src/buildWhatsNewSite.ts"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"17a64c34d732dd69b02a3a617c76fdae0cf8f4352f7ae15381102b49d7326cc1"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_: Exception)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/group/IjFileGroup.kt"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ab58230e429297521e06c9a9b307916088a20ed9f2bb498b21465c0cc4f05a3"}},{"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":"src/main/java/com/maddyhome/idea/vim/helper/HandlerInjector.kt"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"32d70cf9e7858dc90a31de3d589717bf0fb12530c88db87cec5460a5e1b38cba"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e: Exception)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e288b4b2acddfbee2e551369d51a4dd88ae3cd30f6216a4390889afb6a3e0fc"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (e: Exception)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/Util.kt"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"558da4d4a2d4c75186a62eb499137665e413a7983a58e450bc4f2364a00f351d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (caught, then discarded): \u0060catch (_: Throwable)\u0060 takes every exception and records none of it \u2014 the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch and only the substituted value survives. Log it through whatever this codebase already uses to report problems, narrow the catch to the exception this call can actually raise, or say in a comment on the catch why the failure genuinely cannot matter."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/Command.kt"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecb925913efe2e7b6f098cad5ef73e1274ddd1983f76c3cbe0ae7808b9142e76"}}],"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-1352","guid":"5257f322-5cfc-6b52-bedd-0b9a526b4c7d","name":"CWE-1352","shortDescription":{"text":"CWE-1352"},"helpUri":"https://cwe.mitre.org/data/definitions/1352.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-4","guid":"c859d8ea-8b24-a157-9406-94929c10397a","name":"Poisoned Pipeline Execution (PPE)","shortDescription":{"text":"Poisoned Pipeline Execution (PPE)"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-04-Poisoned-Pipeline-Execution"},{"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-7","guid":"4c4af28d-49e3-2d51-b597-e1396c49658b","name":"Insecure System Configuration","shortDescription":{"text":"Insecure System Configuration"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-07-Insecure-System-Configuration"},{"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":203,"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."]}]}