{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D23","name":"Boundary Type-Coupling","shortDescription":{"text":"Boundary Type-Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D23"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"],"owasp":"A05:2025"}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"],"owasp":"A03:2025"}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"],"owasp":"A03:2025"}},{"id":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37","relationships":[{"target":{"id":"CWE-1059","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A02:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1059"],"owasp":"A02: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":"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":"AX9","name":"CQS / query purity","shortDescription":{"text":"CQS / query purity"},"helpUri":"https://codehealth.canine.dev/dimensions/AX9"},{"id":"AXB1","name":"Runtime evidence locked \u2014 no reproducible boot","shortDescription":{"text":"Runtime evidence locked \u2014 no reproducible boot"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB1"},{"id":"DM1","name":"Aggregate boundaries","shortDescription":{"text":"Aggregate boundaries"},"helpUri":"https://codehealth.canine.dev/dimensions/DM1"},{"id":"DM2","name":"Strongly-typed ids","shortDescription":{"text":"Strongly-typed ids"},"helpUri":"https://codehealth.canine.dev/dimensions/DM2"},{"id":"DM4","name":"Rich vs anemic domain model","shortDescription":{"text":"Rich vs anemic domain model"},"helpUri":"https://codehealth.canine.dev/dimensions/DM4"},{"id":"DM5","name":"Encapsulated state","shortDescription":{"text":"Encapsulated state"},"helpUri":"https://codehealth.canine.dev/dimensions/DM5"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"ES1","name":"Fold determinism","shortDescription":{"text":"Fold determinism"},"helpUri":"https://codehealth.canine.dev/dimensions/ES1"},{"id":"ES2","name":"Immutable events","shortDescription":{"text":"Immutable events"},"helpUri":"https://codehealth.canine.dev/dimensions/ES2"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P10","name":"Library API \u0026 versioning","shortDescription":{"text":"Library API \u0026 versioning"},"helpUri":"https://codehealth.canine.dev/dimensions/P10"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"id":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P5","name":"DR \u0026 Backup","shortDescription":{"text":"DR \u0026 Backup"},"helpUri":"https://codehealth.canine.dev/dimensions/P5"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"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":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X27","name":"Collection changed while being enumerated","shortDescription":{"text":"Collection changed while being enumerated"},"helpUri":"https://codehealth.canine.dev/dimensions/X27"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X4","name":"Structured logging","shortDescription":{"text":"Structured logging"},"helpUri":"https://codehealth.canine.dev/dimensions/X4"},{"id":"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":"(anonymous) (cyclomatic 152): (anonymous) has cyclomatic complexity 152 (threshold 15). Most of this is not in the body itself: 12 of the 152 points are its own statements and the rest belongs to 142 function items inside it that branch (execPayload, open, openWebview, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/extensions/bridge.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e8292d1c9f31191312a6ee92e6f5aebfa3873d42b41a579a2f6299022d436f8"}},{"ruleId":"D1","level":"warning","message":{"text":"(anonymous) (cyclomatic 93): (anonymous) has cyclomatic complexity 93 (threshold 15). Most of this is not in the body itself: 6 of the 93 points are its own statements and the rest belongs to 62 function items inside it that branch (open, format, fetch, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3975ea5ccbea813dc606bb7e92be68d697f8eb4a58cf7e31707e0c9093e2ea32"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::receive_git (cyclomatic 75): AppModel::receive_git has cyclomatic complexity 75 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/git.rs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"77ce86a60b914716db7761404a7f150e76201a7c42d648ad482cbd49a7d6f5fc"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::apply_preference (cyclomatic 60): AppModel::apply_preference has cyclomatic complexity 60 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/preferences.rs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"cef1b1aee9db206586c6ce63bf292ff789b0ce88fb427701e2bcc7d924d05966"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::perform_menu (cyclomatic 59): AppModel::perform_menu has cyclomatic complexity 59 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/menu.rs"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"581880ffc8c7a9924bb008c64e48b26a46505e7f38d51780eabb0c8ffea7409f"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::terminal::input::encode_with_bindings (cyclomatic 52): muxy_app::views::terminal::input::encode_with_bindings has cyclomatic complexity 52 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/input.rs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae73546c19975bda20d43d7223afb1e4471e365462013e978b1a389aaf6210f"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::receive (cyclomatic 50): AppModel::receive has cyclomatic complexity 50 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":2157}}}],"partialFingerprints":{"codehealthFindingId/v1":"08d8f481354d0689833528f6c870a5d58eaf5fa32aaf4764c515368c1cbfe5d8"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::settings::appearance::rows (cyclomatic 44): muxy_app::views::settings::appearance::rows has cyclomatic complexity 44 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/appearance.rs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1d2ea0814935697cc7aba94aa14f62cefeeadfbe6c093d2ddd34e73ac9afb4e"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalOptions::read (cyclomatic 44): TerminalOptions::read has cyclomatic complexity 44 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty/options.rs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"55623bdddaaee64bf6d6eab25276394e88fa1b25776f1b45511e3df3ebdfd766"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::dispatch_extension (cyclomatic 42): AppModel::dispatch_extension has cyclomatic complexity 42 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/calls.rs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb5dba6c884b0a0d273c0b9ef6ad77234473236679ffb17da951cabfda5f39f"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::settings::terminal::rows (cyclomatic 40): muxy_app::views::settings::terminal::rows has cyclomatic complexity 40 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/terminal.rs"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e2fd4b546d216b4e13fd8be43304c6b4a4ba2cb8619e1d50ba79cf7b17c6797"}},{"ruleId":"D1","level":"warning","message":{"text":"Picker::render_item (cyclomatic 37): Picker::render_item has cyclomatic complexity 37 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"54dd468201c94c7eb738f937a94625f759eec6a6b18ff301b1e8e0af1f13ba68"}},{"ruleId":"D1","level":"warning","message":{"text":"Metadata::visit (cyclomatic 35): Metadata::visit 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":"crates/muxy-app-core/src/agent_sessions/parse.rs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"029fb3edba46addb3cb1ecd098576afed98e84d80e5f4592db9c02f8b097c9d8"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::browser::args::invocation (cyclomatic 34): muxy_cli::browser::args::invocation has cyclomatic complexity 34 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: muxy_cli::browser::args::verb (cyclomatic 37) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded function is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/browser/args.rs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"af232673e87660b68beac932207e933ba2726099a66a41901444a082a363c0cd"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::boot::worker (cyclomatic 33): muxy_app::boot::worker has cyclomatic complexity 33 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This is NOT this file\u0027s highest cyclomatic complexity: Work::name (cyclomatic 49) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded function is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/boot.rs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"3156c76e02bcf51ed9a7fb0166dec75647d5d51baa0438609f9df278d5a255bf"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalSettings::save (cyclomatic 33): TerminalSettings::save has cyclomatic complexity 33 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty.rs"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"6da4032eaf89f4bc0f355facd131e7f754aedcf90a8664b5cb53271c342b2778"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::tui::keys::overlay (cyclomatic 33): muxy_cli::tui::keys::overlay has cyclomatic complexity 33 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/tui/keys.rs"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcdc07bad3e24d06662b18842d7c99efdda528a51affdfa2ac85ee9f8edcc2c1"}},{"ruleId":"D1","level":"warning","message":{"text":"(anonymous) (cyclomatic 32): (anonymous) has cyclomatic complexity 32 (threshold 15). Most of this is not in the body itself: 3 of the 32 points are its own statements and the rest belongs to 16 function items inside it that branch (restore, finish, a function literal at line 61, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/browser/element_picker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba982a57cdf131ef8be27b5cb5aa3b7ad4bf10289ea7746acad0e65fe44fc7cc"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::overlays::layer (cyclomatic 31): muxy_app::views::overlays::layer has cyclomatic complexity 31 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/overlays.rs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b3393848be2a7e4b96ba19d85ec6aa5995a44f72e671ec59b394219ba2e0677"}},{"ruleId":"D1","level":"warning","message":{"text":"Owner::serve (cyclomatic 30): Owner::serve 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":"crates/muxy-server/src/session/owner.rs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"1848e27ab3248ab8b962255e0741b07a423eef29953d6da6d4f5991cdf9ffda6"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_server::connection::reader::run (cyclomatic 30): muxy_server::connection::reader::run 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. This is NOT this file\u0027s highest cyclomatic complexity: muxy_server::connection::reader::ordered_request (cyclomatic 38) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded function is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/reader.rs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e79480de9dcdbf7401e6ab13b7c185a5ff5c8e9131b35d3a0d2987b93602722"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::submit_composer (cyclomatic 29): AppModel::submit_composer has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/composer.rs"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"818feacc8bf19fbb622464b736f0f2e17d1be51f32b90629b82f3a8e8805dc99"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_protocol::validate::validate_reply (cyclomatic 29): muxy_protocol::validate::validate_reply has cyclomatic complexity 29 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/validate.rs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"14dece6a51209cca22fe7b488a370b320edd998ba1709ddbf57c1accddbf463b"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalPane::key_binding (cyclomatic 28): TerminalPane::key_binding has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":1487}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a7144e7de601c6ff162a2556dd6f830a1b57483c6a8e89cfb35a2a0723316f4"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalSettings::read_source (cyclomatic 28): TerminalSettings::read_source has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c6a1575b51385e3f6c8293bb5655e55c75596402e119cc905211bace0883475"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::update_git_picker (cyclomatic 27): AppModel::update_git_picker has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git.rs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"908833d4f496f26f9463f9202a366167ab8516e8c414f871c656ead9b37aa70b"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::backup::archive::read (cyclomatic 27): muxy_app::backup::archive::read has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/backup/archive.rs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"828337f4bafc46d7fe1001d4ece3a0aca101c2cb786b968bf58e2680d8aaa8ac"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::tui::keys::prefix (cyclomatic 27): muxy_cli::tui::keys::prefix has cyclomatic complexity 27 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/tui/keys.rs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"e686ae7299e722a8eb9c4195f3b479d06dcf61a168b4b21e87c2961368e808b8"}},{"ruleId":"D1","level":"warning","message":{"text":"GitRequest::validate (cyclomatic 27): GitRequest::validate has cyclomatic complexity 27 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 4 belong to 2 function items inside it that branch. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/git.rs"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"3091c8ef61bbef53973acf57286c0b632b66b3500f5688ebc9e0dd63b745505d"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::input::encode (cyclomatic 26): muxy_cli::input::encode has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/input.rs"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cb93c08e920d57c22d307e34cbe1019e4ddb16d13871611187abc741f740510"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_protocol::validate::validate_request (cyclomatic 26): muxy_protocol::validate::validate_request has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/validate.rs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"450989ef7c0f4b29326f080121147972e8941f4aa51afc128ba9eab8210fbb45"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::receive_event (cyclomatic 25): AppModel::receive_event 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":"crates/muxy-app/src/model.rs"},"region":{"startLine":2611}}}],"partialFingerprints":{"codehealthFindingId/v1":"46e5868bfd0fd766abf4c9cf8aaa6964a63e8258d478be990d4f2ef21a14fae6"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::tui::events (cyclomatic 25): muxy_cli::tui::events 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":"crates/muxy-cli/src/tui/mod.rs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"75276e268714606ec0bb846b2da06a09f6260722b4695d38953154be080dde8e"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_mobile::keys::encode (cyclomatic 25): muxy_mobile::keys::encode has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-mobile/src/keys.rs"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"486042d51f3910e3363380756e9f2f6ae0e371f516cec725ad0c3686955b8b7e"}},{"ruleId":"D1","level":"warning","message":{"text":"Registry::dispatch_git (cyclomatic 25): Registry::dispatch_git has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/mod.rs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"778e8e8983727a435f6395c0c68d7e654bd621883c47c426539c645cb360c988"}},{"ruleId":"D1","level":"warning","message":{"text":"TextElement::prepaint (cyclomatic 25): TextElement::prepaint 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":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":1627}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2b8409d8850211c0ea2935b0cc3be68a0311b22e11a8eec2928d9ba0ced637b"}},{"ruleId":"D1","level":"warning","message":{"text":"SettingsView::refresh_results (cyclomatic 24): SettingsView::refresh_results 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":"crates/muxy-app/src/views/settings/results.rs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"93d25f5fd812970318d984aa38057a0dcd357de77ead546925074b533633a958"}},{"ruleId":"D1","level":"warning","message":{"text":"FontOptions::read (cyclomatic 24): FontOptions::read 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":"crates/muxy-app-core/src/settings/ghostty/fonts.rs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fa34c8402cf5922e3ba4a3875e1cf9eaf91256f110b7f1f545932b424e6ca9c"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::worker::apply (cyclomatic 24): muxy_cli::worker::apply has cyclomatic complexity 24 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":893}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a74e70f1414a92857387f3a0e790c1400f9f6c2ca4770d1ad2062aad4cc247d"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_ui::webview::linux::page::keyval (cyclomatic 24): muxy_ui::webview::linux::page::keyval has cyclomatic complexity 24 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/linux/page.rs"},"region":{"startLine":1420}}}],"partialFingerprints":{"codehealthFindingId/v1":"69a9aa74d485319a60c0cb9c6c42edc53bca135798fb629036d3d3add0e3545b"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::create_terminal_view (cyclomatic 23): AppModel::create_terminal_view has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":1734}}}],"partialFingerprints":{"codehealthFindingId/v1":"65f38be06d1e9310f720126f0fcf297fb2d09b8bde7bfb8638763669572f94c7"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::perform_server_menu (cyclomatic 23): AppModel::perform_server_menu has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/server_menu.rs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"64114ea489fa5adcff0f4da7998ab73905d23e139a42cc0d467aef8a82d14c8d"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalPane::metadata (cyclomatic 23): TerminalPane::metadata has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ec1e1548f0e0fd055166d3d80dd87977ead7dcae6cadf8e393c8d58edfdadc7"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_client::bridge::explain (cyclomatic 23): muxy_client::bridge::explain has cyclomatic complexity 23 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-client/src/bridge.rs"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"2774c5689fe8ffcc73f512b36728e4f99c499cbbe92186bbd3c220578b667136"}},{"ruleId":"D1","level":"warning","message":{"text":"(anonymous) (cyclomatic 23): (anonymous) has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 2 of the 23 points are its own statements and the rest belongs to 11 function items inside it that branch (__muxyTick, format, schedule, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/extensions/script.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"98a2f3933e85e80e45803f901a5b5f7f7b774b3e7be63a076ffba3d481b268d0"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::request_pull_request_action (cyclomatic 22): AppModel::request_pull_request_action has cyclomatic complexity 22 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/pr.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"78419fc4f5cd87abca49445fe951f009e595853bc4e99a41c6c1e86294f89ae6"}},{"ruleId":"D1","level":"warning","message":{"text":"Frame::extend_row (cyclomatic 22): Frame::extend_row has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element/padding.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"5471ac4995e008a088542df4b11de3640fb1df593dcf50db163cfd14941b522d"}},{"ruleId":"D1","level":"warning","message":{"text":"Webview::handle (cyclomatic 22): Webview::handle has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/mod.rs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b0038bee127d8c9975eb0ca1af79e5ebe79ef58540c7a522bc16eb059c7339"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::ai::capture (cyclomatic 22): muxy_app::ai::capture has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/ai.rs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c77151f126b3a09a5d82ed39f17a57ef018f8be85c786dade4e99721138628e"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::git::form::render (cyclomatic 22): muxy_app::views::git::form::render has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/form.rs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e3d0c65203b1cd5fbd25207f121eb650092f020211ce6afb8a18ac4fc9bd47c"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::terminal::element::paint (cyclomatic 22): muxy_app::views::terminal::element::paint has cyclomatic complexity 22 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ddd24aca8b67ec990d686505bb41497a68cca93a2b9dc4778e1d54398c48d5"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::terminal::element::glyph::strokes (cyclomatic 22): muxy_app::views::terminal::element::glyph::strokes has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element/glyph.rs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"186a5a0f6873ae2fc0640ad661246646904859d592358903146b3a4a90dec87b"}},{"ruleId":"D1","level":"warning","message":{"text":"AppState::validate (cyclomatic 22): AppState::validate has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/state.rs"},"region":{"startLine":1014}}}],"partialFingerprints":{"codehealthFindingId/v1":"5405b0011e809bf506dbc74452d5415f31aef4f9db135070f73f1a6fafe506eb"}},{"ruleId":"D1","level":"warning","message":{"text":"State::validate (cyclomatic 22): State::validate has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/state.rs"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c6e86a530c32bb70d8270dd855125a61e31de56405ae1eacfe106712e430830"}},{"ruleId":"D1","level":"warning","message":{"text":"Registry::apply_worktree (cyclomatic 22): Registry::apply_worktree has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/worktree.rs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"c535e55f8d674736aea4c67a709c20fb6ff6201e5241fc0728ee96cb1935e333"}},{"ruleId":"D1","level":"warning","message":{"text":"Picker::render (cyclomatic 22): Picker::render has cyclomatic complexity 22 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":1924}}}],"partialFingerprints":{"codehealthFindingId/v1":"be0c44a2f74a4dae97e5dee39d24da97170423a9492aa86a74a54c97ca372d84"}},{"ruleId":"D1","level":"warning","message":{"text":"Delivery::event (cyclomatic 21): Delivery::event has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/boot/delivery.rs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"12cb03cdd170d50cc608001e02afaf6ccb1613c7c43b7a321866e6e1f2bce126"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::receive_catalog (cyclomatic 21): AppModel::receive_catalog has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/catalog.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad1d13d3d8b6583bf3e057a08e0961eae41273c0d71f5740cce926dfa7b7e17b"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::sync_extension_events (cyclomatic 21): AppModel::sync_extension_events 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":"crates/muxy-app/src/model/extensions/events.rs"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"15c3743e12cfee9a725d2c2430bf57f00d522c2742daa3b928e6456632a631ba"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::sync_webviews (cyclomatic 21): AppModel::sync_webviews has cyclomatic complexity 21 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/webviews.rs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e611e2272a5392acd71fa098051cc3c047506a5901d4d3e1dc90768f781670e"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::close_confirmed (cyclomatic 21): AppModel::close_confirmed has cyclomatic complexity 21 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":1347}}}],"partialFingerprints":{"codehealthFindingId/v1":"81bbf94240e4f8515cc8d831d49a55a2dd4c5ea56678e35831c44dea39543847"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::manage::execute (cyclomatic 21): muxy_cli::manage::execute 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":"crates/muxy-cli/src/manage/mod.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"014c62b17cbdd3b2dc2dd205cc4fdef6824b0c238e03df2ecb2d39a7f974a211"}},{"ruleId":"D1","level":"warning","message":{"text":"Message::validate (cyclomatic 21): Message::validate has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/validate.rs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"463224ed56f86d3b4a7266be15cd268c9f2a04744560b2f554393a5c090cf617"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::browser_event (cyclomatic 20): AppModel::browser_event has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/browsers/mod.rs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"9deb0925ff9aa872b6fcae4b924c7a5aee7172b83012f6671958eec0fdd0bac4"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::dispatch_webview (cyclomatic 20): AppModel::dispatch_webview has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/webviews.rs"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"eafbf8f124d4e20ef4c17fafb6528546c9ea13a41099977785db5251bd7000db"}},{"ruleId":"D1","level":"warning","message":{"text":"BrowserView::handle (cyclomatic 20): BrowserView::handle has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"abd78be3efbde95846b5f99eeccf1da49c2b2c6603e72e329f39363b707997ea"}},{"ruleId":"D1","level":"warning","message":{"text":"ProjectPicker::sync_picker (cyclomatic 20): ProjectPicker::sync_picker has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/project_picker.rs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e6c9a1d415f5a3839853d7b7d81544055bf7c751c8ae45c87bdd9d4e071ee76"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::repository_actions::prepare (cyclomatic 20): muxy_app::repository_actions::prepare has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/repository_actions.rs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"05cd7f8057c404a33028f14731e2f6e2a0122f90b47a213781f006053555005e"}},{"ruleId":"D1","level":"warning","message":{"text":"Pointer::press (cyclomatic 20): Pointer::press has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/tui/mouse.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff3b9abc2a310b9e688f7dd23b56eb837638f3a305cdc568d11df90007e38ec"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_client::events::next_event (cyclomatic 20): muxy_client::events::next_event has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-client/src/events.rs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"d93d12c562304d44b65d9c44f91289b3afcd1ddd1547904303227eb05a9a4543"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_server::git::mutate_files (cyclomatic 20): muxy_server::git::mutate_files has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/mod.rs"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e17fd0c43279aa71c3a6f7460fc19e4018eff0eb46a067c2bbb681e51411d4a"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::extension_client (cyclomatic 19): AppModel::extension_client has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/mod.rs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"d87bf54cbd19f0da56a5ed2cc36017f2071cb507afc292720e950322dd666539"}},{"ruleId":"D1","level":"warning","message":{"text":"BrowserView::present (cyclomatic 19): BrowserView::present has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":731}}}],"partialFingerprints":{"codehealthFindingId/v1":"48871e1b095008457106ea4094274dc5031759cd9ddb8721b84a4a9f52c60773"}},{"ruleId":"D1","level":"warning","message":{"text":"AppState::restore_configuration (cyclomatic 19): AppState::restore_configuration has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd0bafaee085da45a50eab15114fba9f1396ad34e3167c82445383369e452829"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::manage::args::parse (cyclomatic 19): muxy_cli::manage::args::parse has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/manage/args.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1d911db461d02424b330d762a0ffbf2fb145021828fb4c577191f1541694de3"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::update_details (cyclomatic 18): AppModel::update_details 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":"crates/muxy-app/src/model/updates/status.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"b257ef635e987b65cf70f4d173f121353e3c23935d20f9bd1b2029203e905aa6"}},{"ruleId":"D1","level":"warning","message":{"text":"BrowserView::page_event (cyclomatic 18): BrowserView::page_event has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"c98c5ded21f2365e78ac357fa479d33fb24738c8c67f18c36be535d80de0ca2b"}},{"ruleId":"D1","level":"warning","message":{"text":"TerminalPane::receive_history (cyclomatic 18): TerminalPane::receive_history 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":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48b50e46c4fc53a3477a9482d7c755099dbd8bdcbcb292fba706be61f3ab952"}},{"ruleId":"D1","level":"warning","message":{"text":"Core::connected (cyclomatic 18): Core::connected has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"082d4c4f32fadd6c770e7b414fca21341d3bd9da0f9bef362d9b225ebccb8380"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_cli::worker::io::reader (cyclomatic 18): muxy_cli::worker::io::reader has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker/io.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"8408b817d67e51de01cfc5a27c127b7cf4715e19ea7be9fe60e52f3c42cd53ab"}},{"ruleId":"D1","level":"warning","message":{"text":"Requests::route (cyclomatic 18): Requests::route 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. This is NOT this file\u0027s highest cyclomatic complexity: muxy_server::connection::reader::ordered_request (cyclomatic 38) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded function is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/reader.rs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"d69f5559a73e206799bcf743e5e63f9f921c7f72932ac55bceef071c6b9c063f"}},{"ruleId":"D1","level":"warning","message":{"text":"Github::lookup_current (cyclomatic 18): Github::lookup_current has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/github.rs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebdbe0e8302fc1c3dfb93e0fe69b244b91c301eefd34c2af3539fd81e10d029d"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_server::git::command::capture_process (cyclomatic 18): muxy_server::git::command::capture_process has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/command.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba54c6eedd6ce82d82cd78b29ac0c23f0e1b7590757fa1d0ad8732d956fae7c9"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::sync_visible (cyclomatic 17): AppModel::sync_visible has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":1641}}}],"partialFingerprints":{"codehealthFindingId/v1":"74a91cd9d1ceb71d5ba8220cd03be3d5a81cd2764b0d66e4221fc575e98bc62f"}},{"ruleId":"D1","level":"warning","message":{"text":"Webview::present (cyclomatic 17): Webview::present has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/mod.rs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac9790e442de9840e894f224cad9c875a10eec93dcdbd68bd2bc3ddf60042bb8"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::settings::terminal::choices (cyclomatic 17): muxy_app::views::settings::terminal::choices has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/terminal.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"acb0ceb31c7922c81372d859f68282d9085b90b24e4fe00556ff50f8ece7d8f9"}},{"ruleId":"D1","level":"warning","message":{"text":"Binary::value (cyclomatic 17): Binary::value has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/localization/plist/binary.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0816ac46ec19ea427464fafca0ad5b12987b116262f2e9b9ac74856f0ace1fd"}},{"ruleId":"D1","level":"warning","message":{"text":"Keymap::from_overrides (cyclomatic 17): Keymap::from_overrides has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/keymap.rs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6c0381df6b182a7577fa8133d03b2364d6698910168c165230f8f1c6aea53a5"}},{"ruleId":"D1","level":"warning","message":{"text":"Catalog::begin_mutation (cyclomatic 17): Catalog::begin_mutation has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/catalog/mutations.rs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d64837f8bc030a8db66a7159e515a4186ca60d88358b56782d2a9d5a072088"}},{"ruleId":"D1","level":"warning","message":{"text":"Outbox::push_control (cyclomatic 17): Outbox::push_control has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/outbox.rs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"acd100a2666c4f44f3106f377e6dc4a66423261f5865b810da14c9723a88dcf5"}},{"ruleId":"D1","level":"warning","message":{"text":"FileWatch::new (cyclomatic 17): FileWatch::new has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/files/watch.rs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"0603f80f10b00d1379435596719aec0d21024002eff85855038dbabfd9bf0d4f"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_server::exec::supervise (cyclomatic 17): muxy_server::exec::supervise has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/exec.rs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a9884ea43d99b550b2640bf95d1dd7748dcd534624c4b445423156f2e6981b"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_ui::webview::host::monitor (cyclomatic 17): muxy_ui::webview::host::monitor has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages. This is NOT this file\u0027s highest cyclomatic complexity: muxy_ui::webview::host::native_keystroke (cyclomatic 20) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded function is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/host.rs"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dbc3bbc7672c415e53c9ec317052b619306de140376060515a5bfc916fdd49a"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::terminal_menu (cyclomatic 16): AppModel::terminal_menu has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/links.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e2db6d5e10f2604219ba017abef4eb9c6d3dc28b6f4ad5adecd613776d90a97"}},{"ruleId":"D1","level":"warning","message":{"text":"AppModel::sync_pane_focus (cyclomatic 16): AppModel::sync_pane_focus has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/workspace.rs"},"region":{"startLine":861}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1b4ede0a3d1d1d45953afee14082616f023d59ab5ad35f50872fb1164e908de"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::tab_strip::drag::move_pointer (cyclomatic 16): muxy_app::views::tab_strip::drag::move_pointer has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/tab_strip/drag.rs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"724cabe48f93b8732bb129ec766322df893505f70774ff4e782fe905125246ec"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_app::views::terminal::element::prepare (cyclomatic 16): muxy_app::views::terminal::element::prepare has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"432fef3fd3881cb354e4741e0b48e26e81ffec29fc24ab0d41ee1b0193785e06"}},{"ruleId":"D1","level":"warning","message":{"text":"muxy_core::l10n::format::write_argument (cyclomatic 16): muxy_core::l10n::format::write_argument has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-core/src/l10n/format.rs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca49b36ad774ecb0e25edcf6364d31ced514cd8ebeb81c9be8b18a329fbccdeb"}},{"ruleId":"D1","level":"warning","message":{"text":"Detector::update (cyclomatic 16): Detector::update has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/detection/mod.rs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"92a5f839c4c5df0f1c94fc0064b0aaa26eb69b519d5a4a3db072a7e4cf5af376"}},{"ruleId":"D1","level":"warning","message":{"text":"Metadata::update (cyclomatic 16): Metadata::update has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/metadata.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"c064c0ad90a40d5aa05a992797db394d2ac4f689ab03e0bda1875e4cef82ce98"}},{"ruleId":"D1","level":"warning","message":{"text":"Owner::update_metadata (cyclomatic 16): Owner::update_metadata has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/owner.rs"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3bb4ee99dd1b1e82dbe170df05c0ab2c68d079bf474385e46b6fa4fd3f3f837"}},{"ruleId":"D1","level":"warning","message":{"text":"Terminal::encode_mouse (cyclomatic 16): Terminal::encode_mouse has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-terminal/src/ghostty.rs"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab90b6886727197bd961c491e905e500a5820c89f93f3b22b5a6455ed420a69"}},{"ruleId":"D1","level":"warning","message":{"text":"Cache::snapshot (cyclomatic 16): Cache::snapshot has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-terminal/src/graphics.rs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"57294182fcd1d57d9857f1ba60744a614aa8c5874ad248b3457709f2b299a72a"}},{"ruleId":"D1","level":"warning","message":{"text":"TextElement::paint (cyclomatic 16): TextElement::paint has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":1866}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d4bf2820d1ee72e1a1667818fc1ed4f7c40a6a75637c98bc9d2f9bc46073dc"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous) (cognitive 186): (anonymous) has cognitive complexity 186 (threshold 15). Drivers by points: boolean chains 64, if/else 48 (62 pts), ternaries 27 (35 pts), error handling 8 (17 pts), loops 5 (8 pts) (nesting depth added 34). Of this number, 16 points are the body\u0027s own statements and 170 belong to 142 function items inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/extensions/bridge.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"407141904d031d86cfa9b9e2c139877309dbfb30922b66007c8df3f50947094a"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::receive_git (cognitive 105): AppModel::receive_git has cognitive complexity 105 (threshold 15). Drivers by points: if/else 34 (72 pts), boolean chains 17, match/switch 7 (16 pts) (nesting depth added 47). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/git.rs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"f35fffb26a470f405f03c6e6c8e86a54e0c897f1837f0771dc3d1db6202df5d4"}},{"ruleId":"D2","level":"warning","message":{"text":"Picker::render_item (cognitive 84): Picker::render_item has cognitive complexity 84 (threshold 15). Drivers by points: if/else 36 (69 pts), boolean chains 8, loops 2 (6 pts), match/switch 1 (nesting depth added 37). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e8557cc6a8a0fba86d9de676aefb39d6b83f5fd10c1df8938e09cbc0b6cb2f5"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::element::glyph::strokes (cognitive 58): muxy_app::views::terminal::element::glyph::strokes has cognitive complexity 58 (threshold 15). Drivers by points: if/else 20 (44 pts), loops 3 (6 pts), match/switch 2 (6 pts), boolean chains 2 (nesting depth added 31). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element/glyph.rs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f7876823771d06a17de43fb84c1854ee6babcee5d603a3f5a5b7247ff2eb131"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::settings::appearance::rows (cognitive 56): muxy_app::views::settings::appearance::rows has cognitive complexity 56 (threshold 15). Drivers by points: if/else 23 (32 pts), boolean chains 17, loops 5, match/switch 1 (2 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/appearance.rs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"db52dbca422d3ba42881d3b982128a6802bc26dc2700446b1f408e6439990075"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::connection::reader::run (cognitive 48): muxy_server::connection::reader::run has cognitive complexity 48 (threshold 15). Drivers by points: if/else 10 (32 pts), match/switch 4 (10 pts), boolean chains 5, loops 1 (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/reader.rs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"7618119fff337455fe3051cefa32c5c7d45a255b5aae72a035a7a60fd78d7abc"}},{"ruleId":"D2","level":"warning","message":{"text":"TextElement::prepaint (cognitive 47): TextElement::prepaint has cognitive complexity 47 (threshold 15). Drivers by points: if/else 27 (41 pts), boolean chains 3, loops 1 (2 pts), match/switch 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":1627}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f24e4d97f667edfba70d6bdc3a0a38785ce3192882ed50384811b28ba689cef"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::update_git_picker (cognitive 46): AppModel::update_git_picker has cognitive complexity 46 (threshold 15). Drivers by points: if/else 20 (31 pts), boolean chains 6, loops 2 (6 pts), match/switch 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":"crates/muxy-app/src/views/git.rs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a70127a2b435e19df5266dbfa7e71af121779a71ad809275025d2d831ec467a"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::boot::worker (cognitive 46): muxy_app::boot::worker has cognitive complexity 46 (threshold 15). Drivers by points: if/else 13 (31 pts), match/switch 4 (12 pts), boolean chains 2, loops 1 (nesting depth added 26). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/boot.rs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f60c41554981af27bc55f3251b6b8a7a00bef6b4f65aa5dd224f522b7fc718c"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::apply_preference (cognitive 45): AppModel::apply_preference has cognitive complexity 45 (threshold 15). Drivers by points: if/else 20 (35 pts), match/switch 3 (5 pts), boolean chains 4, loops 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/preferences.rs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb9e8c62f42f630ddd6e9c11dc4f94e1ada72f773bc63e1202dc02cafa880d3"}},{"ruleId":"D2","level":"warning","message":{"text":"Frame::extend_row (cognitive 45): Frame::extend_row has cognitive complexity 45 (threshold 15). Drivers by points: if/else 15 (32 pts), boolean chains 9, loops 2 (4 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element/padding.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"e604ddc3025dcb95bbcc4087bf49f9cd4eb4af4fd30eb3801c940662ade4de06"}},{"ruleId":"D2","level":"warning","message":{"text":"Metadata::visit (cognitive 43): Metadata::visit has cognitive complexity 43 (threshold 15). Drivers by points: if/else 17 (28 pts), boolean chains 11, loops 1 (3 pts), match/switch 1 (nesting depth added 13). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/agent_sessions/parse.rs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"89521b31c9b242ab5f7ae5a6ae01aeb1e6ecb1140268ed50f25f376688db22c3"}},{"ruleId":"D2","level":"warning","message":{"text":"Registry::apply_worktree (cognitive 43): Registry::apply_worktree has cognitive complexity 43 (threshold 15). Drivers by points: if/else 17 (38 pts), boolean chains 3, match/switch 1 (2 pts) (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/worktree.rs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"b68ce93c4d347315fd46cc0bc0a90091f4375fa07fa092e9cdebca122ac24e24"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::submit_composer (cognitive 39): AppModel::submit_composer has cognitive complexity 39 (threshold 15). Drivers by points: if/else 15 (26 pts), match/switch 4 (7 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/composer.rs"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"d145c4da3257eba8180c3cf1e03c8905c6eafc02ded52154ec103acf21275e42"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::tui::events (cognitive 38): muxy_cli::tui::events has cognitive complexity 38 (threshold 15). Drivers by points: if/else 15 (30 pts), match/switch 2 (5 pts), boolean chains 2, loops 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/tui/mod.rs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c8f69aadcbd12f3fa58357e618dbd4a9f44fea679eaf77daa1459feb96d44d7"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::element::paint (cognitive 37): muxy_app::views::terminal::element::paint has cognitive complexity 37 (threshold 15). Drivers by points: loops 12 (21 pts), if/else 8 (14 pts), match/switch 1 (2 pts) (nesting depth added 16). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"1217b22dcdbb734b36a42a5794e1a47353fbce74694426cda154a366bb6dd3cb"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::backup::archive::read (cognitive 36): muxy_app::backup::archive::read has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (26 pts), boolean chains 7, loops 2, match/switch 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/backup/archive.rs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7096564e638fdbfa5bb74de62c9fcbb8eee317a02131de42d2ed49ea1f3a3b5"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::git::command::capture_process (cognitive 35): muxy_server::git::command::capture_process has cognitive complexity 35 (threshold 15). Drivers by points: if/else 13 (28 pts), boolean chains 3, loops 2, match/switch 1 (2 pts) (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/command.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"a61bcea3dc705d9f72fd30e67cf97728df196338df8fe4a5dcddff95ea16a99d"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::receive (cognitive 34): AppModel::receive has cognitive complexity 34 (threshold 15). Drivers by points: if/else 17 (32 pts), boolean chains 1, match/switch 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":2157}}}],"partialFingerprints":{"codehealthFindingId/v1":"e63d4b1ea38007f3e252b574c6cfc299e15e9e236a97262e9f5bc9ed383b3cdd"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::ai::capture (cognitive 34): muxy_app::ai::capture has cognitive complexity 34 (threshold 15). Drivers by points: if/else 9 (19 pts), match/switch 4 (10 pts), loops 3 (4 pts), boolean chains 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/ai.rs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad1e6250d4e654ee20f9a18e77e3c27d1f32d4dedfe2a9aeb5560e4b51d6a539"}},{"ruleId":"D2","level":"warning","message":{"text":"FontOptions::read (cognitive 34): FontOptions::read has cognitive complexity 34 (threshold 15). Drivers by points: if/else 15 (26 pts), loops 2 (4 pts), boolean chains 2, match/switch 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":"crates/muxy-app-core/src/settings/ghostty/fonts.rs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"9abb399d292dc24a8fbd4770174ef8bc8bdd9c8eb448168e8531e4ec714b18e7"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalSettings::read_source (cognitive 34): TerminalSettings::read_source has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (23 pts), boolean chains 6, match/switch 2 (4 pts), loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"db7713c4722f30e7a5406ce73cc00c039d9d4dfca600951231ea565462af9ed8"}},{"ruleId":"D2","level":"warning","message":{"text":"AppState::restore_configuration (cognitive 34): AppState::restore_configuration has cognitive complexity 34 (threshold 15). Drivers by points: if/else 10 (22 pts), loops 8 (11 pts), boolean chains 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2645e0ef26897723ca4cc5943175ae07d1d8f18c4d3447155dfee134e9c2694"}},{"ruleId":"D2","level":"warning","message":{"text":"State::validate (cognitive 34): State::validate has cognitive complexity 34 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 9, loops 4 (7 pts), match/switch 1 (2 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/state.rs"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2cd40877c2796732fb2b6bf66bcf5dcded5f18fa953c29888dbb9ce347d2a84"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::sync_extension_events (cognitive 33): AppModel::sync_extension_events has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (20 pts), loops 9 (12 pts), boolean chains 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/events.rs"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b0fd66524bab4fe22496f603bf150355a3d9510ac7a11d64d2721e6f0753b11"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalSettings::save (cognitive 33): TerminalSettings::save has cognitive complexity 33 (threshold 15). Drivers by points: if/else 14 (17 pts), loops 6 (9 pts), boolean chains 4, match/switch 2 (3 pts) (nesting depth added 7). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty.rs"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c20b08b974ff68a5bdcfccca49e9f59a824aab3cdbcdaeec2187f71c59d491e"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::sync_visible (cognitive 32): AppModel::sync_visible has cognitive complexity 32 (threshold 15). Drivers by points: if/else 12 (27 pts), loops 3, boolean chains 2 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":1641}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5686ef415e33e410b37d1be0af8275527f8ee964ac965da12580b2e03a18372"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsView::refresh_results (cognitive 32): SettingsView::refresh_results has cognitive complexity 32 (threshold 15). Drivers by points: if/else 14 (23 pts), boolean chains 4, loops 2 (4 pts), match/switch 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/results.rs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef35cd9c668b41cb476f6477cb32f64c8f40371baee78b5314552bdfb01d5e7c"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::picker::search::scan (cognitive 30): muxy_app::picker::search::scan has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (24 pts), boolean chains 3, 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":"crates/muxy-app/src/picker/search.rs"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"9119176468ff69e9b00c3098fe74c0263f13aad92e5da3014abb850f1475b9e8"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::element::prepare (cognitive 30): muxy_app::views::terminal::element::prepare has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (21 pts), loops 2 (5 pts), boolean chains 4 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab022f7ff3e0afb510f74c993f3d87e67646a0b6c8085dbffb70197bc7fc61bf"}},{"ruleId":"D2","level":"warning","message":{"text":"Catalog::scan (cognitive 30): Catalog::scan has cognitive complexity 30 (threshold 15). Drivers by points: if/else 7 (20 pts), match/switch 1 (4 pts), boolean chains 3, loops 2 (3 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":"crates/muxy-app-core/src/agent_sessions/files.rs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"b69669ea1017c74da7375f0eea87f60904a298fa2e249f0bc0d460a8e940b8dd"}},{"ruleId":"D2","level":"warning","message":{"text":"AppState::validate (cognitive 30): AppState::validate has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (19 pts), boolean chains 6, loops 4 (5 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/state.rs"},"region":{"startLine":1014}}}],"partialFingerprints":{"codehealthFindingId/v1":"83d8b946a0dee2df65fb8a7cd9a65e7aa604fab8881ad74195cc4c23368a5f21"}},{"ruleId":"D2","level":"warning","message":{"text":"Core::connected (cognitive 30): Core::connected has cognitive complexity 30 (threshold 15). Drivers by points: if/else 7 (16 pts), match/switch 3 (8 pts), boolean chains 4, loops 2 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4a34f321bad6b369a7ec7d9a854c34f32faa4b12bbfd1cb9af9501c7019a934"}},{"ruleId":"D2","level":"warning","message":{"text":"Cache::snapshot (cognitive 30): Cache::snapshot has cognitive complexity 30 (threshold 15). Drivers by points: if/else 9 (24 pts), match/switch 1 (4 pts), boolean chains 1, loops 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-terminal/src/graphics.rs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"0700851efcfc8ce0ca2e6bec6f7768b3ce3472a66a83d1e569b9802c28810ee7"}},{"ruleId":"D2","level":"warning","message":{"text":"FileWatch::new (cognitive 29): FileWatch::new has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (20 pts), loops 3 (5 pts), boolean chains 3, match/switch 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/files/watch.rs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"c13e372cc600348aee1bb3c89dcdeab916b9c4e2574e3775fbab1eb2bf76c713"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::git::mutate_files (cognitive 29): muxy_server::git::mutate_files has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (20 pts), match/switch 2 (4 pts), boolean chains 3, loops 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/mod.rs"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"53da42b437ce4b64fe39d47df3e793c8ca31af3b876d13e115f248859dbbb0a6"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectPicker::sync_picker (cognitive 28): ProjectPicker::sync_picker has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (20 pts), match/switch 4 (6 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/project_picker.rs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"46878a83a929f4783c4e1f92df8b2d4ff8c555a0c4aab791f3027c60aeb24702"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::git::form::render (cognitive 28): muxy_app::views::git::form::render has cognitive complexity 28 (threshold 15). Drivers by points: if/else 15 (17 pts), boolean chains 9, loops 1 (2 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/form.rs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"894260d9215f40f38fdbd42d774c8622c8332d7a249d83b19890499252ef5f0c"}},{"ruleId":"D2","level":"warning","message":{"text":"Outbox::push_control (cognitive 28): Outbox::push_control has cognitive complexity 28 (threshold 15). Drivers by points: if/else 10 (22 pts), boolean chains 6 (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":"crates/muxy-server/src/connection/outbox.rs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dbf945676cc90ba1c346ec9a161ee83db779e80607f7eb7d91d5334067380fb"}},{"ruleId":"D2","level":"warning","message":{"text":"Requests::route (cognitive 27): Requests::route has cognitive complexity 27 (threshold 15). Drivers by points: if/else 12 (21 pts), match/switch 4 (6 pts) (nesting depth added 11). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/reader.rs"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"dde9a421b6010542465b7fe6195b953c20e6cb6cd3cb65a11c164505db65ccbc"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::update_details (cognitive 26): AppModel::update_details has cognitive complexity 26 (threshold 15). Drivers by points: if/else 19 (24 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/updates/status.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a68bae994176d80dfca84b661ed1efe40f02f7ed211e150c33780c1e1d09f56"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalPane::metadata (cognitive 26): TerminalPane::metadata has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (21 pts), boolean chains 4, 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":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac4791bab197bbe0b85f08701fec75414d8099da97ca23baadd9709d3c57b5c"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalPane::key_binding (cognitive 26): TerminalPane::key_binding has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 3, 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":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":1487}}}],"partialFingerprints":{"codehealthFindingId/v1":"5741176e69283c30408b4bb9fb3a1b5cc2c8890ee74e1781c1a77743e9b4665b"}},{"ruleId":"D2","level":"warning","message":{"text":"Owner::update_metadata (cognitive 26): Owner::update_metadata has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (20 pts), match/switch 1 (3 pts), loops 2, 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":"crates/muxy-server/src/session/owner.rs"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a2853eb917c9b2f3a54fc61ceb2722f54c6f385b7fd766fd98645b6f7f41d97"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::running_agents (cognitive 25): AppModel::running_agents has cognitive complexity 25 (threshold 15). Drivers by points: if/else 4 (14 pts), loops 3 (6 pts), match/switch 1 (4 pts), boolean chains 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":"crates/muxy-app/src/model/agents_panel.rs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cda7bdf89a06a7615cc34ff12a2577c63293359a37a0fb326d6fde1c6ae28e1"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::receive_catalog (cognitive 25): AppModel::receive_catalog has cognitive complexity 25 (threshold 15). Drivers by points: if/else 15 (19 pts), boolean chains 3, loops 1 (2 pts), match/switch 1 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/catalog.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6d2aa79652f9a9d1bbc75b1163506121eb9ff752aacd86968a10c7dd21d0c71"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::settings::terminal::rows (cognitive 25): muxy_app::views::settings::terminal::rows has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (13 pts), match/switch 3 (9 pts), boolean chains 2, loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/terminal.rs"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"29486d7441f3cb245b0ec6f0cc5b1e070af23e3340c79ce2ca1928ce65de143a"}},{"ruleId":"D2","level":"warning","message":{"text":"Catalog::begin_mutation (cognitive 25): Catalog::begin_mutation has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 2, 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":"crates/muxy-server/src/catalog/mutations.rs"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0aa85845fc76b1aa1bcf4a435d8c0f4151ffebb5f5c3a3d82bbf5aa745de155"}},{"ruleId":"D2","level":"warning","message":{"text":"Root::resolve (cognitive 25): Root::resolve has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (22 pts), boolean chains 2, 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":"crates/muxy-server/src/files/root.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"946a023ab0c3aaa73e8586f37c29b9f1016332c54e75b05f0849c5e898eb58d7"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::git::processes::stop (cognitive 25): muxy_server::git::processes::stop has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (15 pts), loops 3 (6 pts), boolean chains 4 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/processes.rs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b3f117494ce77de33e3d8666aa5148996031e443a5911d731824650a66957c2"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous) (cognitive 25): (anonymous) has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 7, error handling 2 (3 pts), loops 2, ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 1 of the 25 points is its own statement and the rest belongs to 11 function items inside it that branch (__muxyTick, format, schedule, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/extensions/script.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee10d422a296f240963421bab7eeff623f555b62da64bdce1d1f389b9d85ee6d"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::settings::server::rows (cognitive 24): muxy_app::views::settings::server::rows has cognitive complexity 24 (threshold 15). Drivers by points: if/else 13 (20 pts), loops 2 (3 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":"crates/muxy-app/src/views/settings/server.rs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"976c32a3ad205caa07ba864d227750b2ce58dc261ac7bbf9a6e8b5136c474738"}},{"ruleId":"D2","level":"warning","message":{"text":"OldStyle::skip (cognitive 24): OldStyle::skip has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 3 (10 pts), loops 3 (9 pts), if/else 1 (5 pts) (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/localization/plist.rs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"264f51f8406ed5cc87e6302cef5cb5085515108b424cfaeee5b56fd21708c8f2"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app_core::backup::projects::import_worktrees (cognitive 24): muxy_app_core::backup::projects::import_worktrees has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (18 pts), loops 2 (3 pts), match/switch 1 (3 pts) (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22e53f14b3d353c16309d14d249f8031d93078ff3fbe680112f8e5fc4c73693"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::ui::sidebar::project_list (cognitive 24): muxy_cli::ui::sidebar::project_list has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/ui/sidebar.rs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"55d70ea9a180d333dbb0979e9d3ee310495cd15d0d72aee9fe61df748da7cfe1"}},{"ruleId":"D2","level":"warning","message":{"text":"CachedRow::refresh (cognitive 24): CachedRow::refresh has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 3, match/switch 1 (3 pts), loops 1 (2 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-terminal/src/links.rs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dd669bbf47e4d24a982cac590a75354c0f90fba449825428c43cfaae3bc024c"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::extension_client (cognitive 23): AppModel::extension_client has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 4, match/switch 2 (3 pts), loops 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":"crates/muxy-app/src/model/extensions/mod.rs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"5aca8c2307918bbbc92c45f9cc104e1294f92378d8b874fb809fc4c88bae9cbc"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::worktrees_synced (cognitive 23): AppModel::worktrees_synced has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 4, loops 1 (3 pts), match/switch 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/worktrees.rs"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"495e1742881fff023dea3355abaad821a720379503d6b9b327fd30f25f32f69b"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::perform_menu (cognitive 23): AppModel::perform_menu has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 4, match/switch 3 (4 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":"crates/muxy-app/src/views/menu.rs"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea275f626b4996f5e48f3075126f90f7606c43aa462c8da0c3a67b81f917f36f"}},{"ruleId":"D2","level":"warning","message":{"text":"Keymap::from_overrides (cognitive 23): Keymap::from_overrides has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (11 pts), boolean chains 7, loops 4 (5 pts) (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/keymap.rs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ae7fc1dfe3de92da5652be82c827a845659c4dc1e55e329b25d044283bb98b0"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::exec::supervise (cognitive 23): muxy_server::exec::supervise has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 7, match/switch 1 (3 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/exec.rs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"da3c66cad03c34d54878303b1fd40201a0471b8015d4f184b27a300bc77ff99d"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::search::row_matches (cognitive 23): muxy_server::search::row_matches has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 4 (7 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/search.rs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"a718c703f11f14476ef4bda4ef27522e0e92561c4b2c1de191985c5cce12547a"}},{"ruleId":"D2","level":"warning","message":{"text":"Picker::render (cognitive 23): Picker::render has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14 (15 pts), boolean chains 6, match/switch 2 (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":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":1924}}}],"partialFingerprints":{"codehealthFindingId/v1":"cda9eaa830548c47d0210e2b07e84f597e52e382186a1aafd732197531ad8fc1"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionList::rebuild (cognitive 22): SessionList::rebuild has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (16 pts), match/switch 1 (3 pts), boolean chains 2, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/agent_sessions/list.rs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"a25e7ea632be656ff69049414367f3de9042e6448c08f4b451f914a46ab086d6"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::sync_webviews (cognitive 22): AppModel::sync_webviews has cognitive complexity 22 (threshold 15). Drivers by points: boolean chains 13, if/else 6 (8 pts), loops 1 (nesting depth added 2). 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":"crates/muxy-app/src/model/webviews.rs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfd985f238c70d5ae295cadc7b250ef27a969dc7e27f8e6b7acba76d63379a3c"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::close_confirmed (cognitive 22): AppModel::close_confirmed has cognitive complexity 22 (threshold 15). Drivers by points: if/else 13 (14 pts), boolean chains 5, match/switch 1 (2 pts), loops 1 (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":"crates/muxy-app/src/model.rs"},"region":{"startLine":1347}}}],"partialFingerprints":{"codehealthFindingId/v1":"d18778d203eb240b1ba6e2c22c1a852b2e64329b6bf3698ce4a4d9ec007a1116"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtensionsView::install (cognitive 22): ExtensionsView::install has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 4 (11 pts), if/else 9 (10 pts), boolean chains 1 (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/extensions.rs"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"9227232623c5f45dd91fc3a6c2e4dd46be6ba157e2d647b1c50b0f25cb62c2c9"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::element::selected_runs (cognitive 22): muxy_app::views::terminal::element::selected_runs has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (16 pts), loops 2 (5 pts), boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c8ffe8841f592e4cd1ae2f91b7252f7c9fd543bc40175532eb062efcf5c0ee"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app_core::backup::projects::import_projects (cognitive 22): muxy_app_core::backup::projects::import_projects has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (16 pts), loops 3, match/switch 1 (2 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc7bab0c92d638c733b5abe0b2b105af176f19e9bbdf3a184b89b683f675ed92"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::browser_event (cognitive 21): AppModel::browser_event has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (15 pts), boolean chains 3, 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":"crates/muxy-app/src/model/browsers/mod.rs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b1a19c7b1d489bb01874f54a617294eb66077c4c4d118193a2f5a969b59ff6"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::check_next_close (cognitive 21): AppModel::check_next_close has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 4, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbdd90fc7d7e317df731e00cd6a02a29c104dd27ef2f079a0000e66820e7f4c1"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::sync_pane_focus (cognitive 21): AppModel::sync_pane_focus has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 7, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/workspace.rs"},"region":{"startLine":861}}}],"partialFingerprints":{"codehealthFindingId/v1":"bee38bf6eb853af34a8dcc7c175fa4372391ab485b67ca9a3c168c35638cabec"}},{"ruleId":"D2","level":"warning","message":{"text":"BrowserView::present (cognitive 21): BrowserView::present has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 10 (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":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":731}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb267debd51014318df761435e3e7ebd0ac9686749be523cd1fdf5e722a2f127"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::model::extensions::consent::dialog_options (cognitive 21): muxy_app::model::extensions::consent::dialog_options has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 3, 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":"crates/muxy-app/src/model/extensions/consent.rs"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"06155ddf578a979d0f47a0068c6ebd98d2dc9aa6d97c2fdb24876fc0199f5310"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::element::background::uncovered (cognitive 21): muxy_app::views::terminal::element::background::uncovered has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (15 pts), loops 3 (5 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element/background.rs"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"06253f6621c1c0f772500dd20393b0beeb334bb6c4878eec3e72bbf0f16b2bd8"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_client::bridge::explain (cognitive 21): muxy_client::bridge::explain has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10, boolean chains 8, match/switch 2 (3 pts) (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":"crates/muxy-client/src/bridge.rs"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"f122130a0e87c7b473b09f90ad17e90b6b77cd8df79fa22a3e9b815f90516d22"}},{"ruleId":"D2","level":"warning","message":{"text":"Delivery::event (cognitive 20): Delivery::event has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11, boolean chains 8, match/switch 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":"crates/muxy-app/src/boot/delivery.rs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8552ae0bb2c59d6d61c58a127ae71e7094dc586466e2b5ccc8dee59babd496f2"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::discard_pending (cognitive 20): AppModel::discard_pending has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 4, loops 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":1521}}}],"partialFingerprints":{"codehealthFindingId/v1":"4506abfbb8dccd885878bd3657e7033deb6384af21d2fd5aa10119cdee2c8ea3"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalPane::receive_history (cognitive 20): TerminalPane::receive_history has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 7 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"a488eecf692782ea9835d4e2d0d1d326169a2c5189cc6f795523bc8c3fc85d65"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalPane::focus_changed (cognitive 20): TerminalPane::focus_changed has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (12 pts), loops 2 (6 pts), boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":797}}}],"partialFingerprints":{"codehealthFindingId/v1":"841dc2bf0c1007c5bef32ddd4f9c5fbe97551e2cbb255609a003c74f46293171"}},{"ruleId":"D2","level":"warning","message":{"text":"Webview::present (cognitive 20): Webview::present has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 7 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/mod.rs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea581cc35d461714a5db1c85d47b3dbeae916e128a65a617f718a588fb8f15f"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::model::remote_servers::join_destination (cognitive 20): muxy_app::model::remote_servers::join_destination has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 4 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/remote_servers.rs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"f120592f1a8b5ae31c653d19641f4a2a3decf3274778dbaac5b57bf871eadf69"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::tab_activity::status_glyph (cognitive 20): muxy_app::views::tab_activity::status_glyph has cognitive complexity 20 (threshold 15). Drivers by points: if/else 12 (17 pts), match/switch 2 (3 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/tab_activity.rs"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c84638024bb67d899bd60f5a622f71bf9007be4ddef4a5e9458c28ecc43f7f3"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::links::detect (cognitive 20): muxy_app::views::terminal::links::detect has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 2, loops 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":"crates/muxy-app/src/views/terminal/links.rs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3107582438fab150b68494566d52b048eeb2fd5511ec19fb3cb41fead159799"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalOptions::read (cognitive 20): TerminalOptions::read has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 5 (10 pts), if/else 4 (6 pts), loops 2 (4 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty/options.rs"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf155d35deec9b0238b04ad63025da8574f8bf5d834d9701627007dd1928e45"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::manage::execute (cognitive 20): muxy_cli::manage::execute has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (16 pts), match/switch 2 (3 pts), boolean chains 1 (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/manage/mod.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"f06e98526d5990d606ff738df4fa8efc6559732fc5ed786b9f0f324ea151db25"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::worker::io::reader (cognitive 20): muxy_cli::worker::io::reader has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 2, match/switch 1 (2 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker/io.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"8129da7872e40be9a95ae1c21550e362b27256edb0cb955df805be8f346baa16"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::request_git_context (cognitive 19): AppModel::request_git_context has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 4 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/git.rs"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eec5a19b60bd6d1e2a73526e33271a7e802ae02a9668d95470ece194406c2aa"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::receive_attached (cognitive 19): AppModel::receive_attached has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (14 pts), boolean chains 5 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":2335}}}],"partialFingerprints":{"codehealthFindingId/v1":"f071cf60e7c1946f4ec3a40e50a8d040aa14c06b8ec370e396399116f7b010f2"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::receive_attach_failed (cognitive 19): AppModel::receive_attach_failed has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (15 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":"crates/muxy-app/src/model.rs"},"region":{"startLine":2407}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3ad60d73a38c05de574c9c40d26065e8324a684cd3d244d10eaadc5006f22d2"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::request_pull_request_action (cognitive 19): AppModel::request_pull_request_action has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9, boolean chains 7, match/switch 3. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/pr.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc335ffa646f3f7af2fcf702113a1dd4bb7dbb20686b20495b84b5ca27a87a30"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtensionsView::change_extension (cognitive 19): ExtensionsView::change_extension has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), match/switch 4 (6 pts), boolean chains 1, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/extensions.rs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"70a8d15289528ed772b2e09083185ed8f4aa8069ae67b536f7efb9f0abfa2e71"}},{"ruleId":"D2","level":"warning","message":{"text":"Paths::paint (cognitive 19): Paths::paint has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (9 pts), loops 3 (7 pts), match/switch 1 (2 pts), boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element/layers.rs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fd5aff9e14ed8c98bcfb1809f025487fab71a77cf62282270579e3d73536f72"}},{"ruleId":"D2","level":"warning","message":{"text":"Scroll::receive (cognitive 19): Scroll::receive has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 2, 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":"crates/muxy-app/src/views/terminal/scroll.rs"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"88279dbf1ad4a58c294487040399775d99e16599ac6638cd24f84649b9616bea"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::backup::transaction::restore (cognitive 19): muxy_app::backup::transaction::restore has cognitive complexity 19 (threshold 15). Drivers by points: if/else 13 (16 pts), boolean chains 2, 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":"crates/muxy-app/src/backup/transaction.rs"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"7aed929b5ce60b8037fe4df4a5e9b218c18d52287247d3d0f74461824cc0dcd0"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::repository_actions::parse_metadata (cognitive 19): muxy_app::repository_actions::parse_metadata has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 2, match/switch 1 (2 pts), loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/repository_actions.rs"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9897d4ffbe79a4c0e1da9768d53a587bdbd149ae5a916a8e77911b866e13040"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::settings::quick_terminal::rows (cognitive 19): muxy_app::views::settings::quick_terminal::rows has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (18 pts), loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/quick_terminal.rs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9c9f2382b86c48fbf41332a149ace5a6acd91d5e8ad30d354f5260bfa037f38"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::input::encode_with_bindings (cognitive 19): muxy_app::views::terminal::input::encode_with_bindings has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 4, match/switch 3 (4 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/input.rs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8e4b4a806b83e2a65dd202889711f9145e9479f4e8dca6d7d17b7c8f7c2801f"}},{"ruleId":"D2","level":"warning","message":{"text":"AppState::merge_configuration (cognitive 19): AppState::merge_configuration has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (10 pts), match/switch 2 (5 pts), boolean chains 2, loops 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bb1773aa0a3815e662090145affc04440daf91f7669d3cca1433e505f84adfd"}},{"ruleId":"D2","level":"warning","message":{"text":"Core::synchronize_pane (cognitive 19): Core::synchronize_pane has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 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":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":716}}}],"partialFingerprints":{"codehealthFindingId/v1":"de77a02a1202b739f31e031bcb25b4b47158527d23ae88f6f5ecc19a8f882c28"}},{"ruleId":"D2","level":"warning","message":{"text":"GitRequest::validate (cognitive 19): GitRequest::validate has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 4, match/switch 2 (3 pts) (nesting depth added 5). Of this number, 13 points are the body\u0027s own statements and 6 belong to 2 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/git.rs"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"d044088c2b4b89eb5075e68ee377226d9c07dd5568573fa601472ebcce779be4"}},{"ruleId":"D2","level":"warning","message":{"text":"Detector::update (cognitive 19): Detector::update has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), boolean chains 5 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/detection/mod.rs"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aec3db0389325b31d47456ad384318a3ef0c90eedf41c1cb0b19c6ff513d11b"}},{"ruleId":"D2","level":"warning","message":{"text":"Github::lookup_current (cognitive 19): Github::lookup_current has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (11 pts), match/switch 5 (7 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/github.rs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed2bf6313658aafd437a1aa7186a71d791584debdb7a5903bf54defef23dc31c"}},{"ruleId":"D2","level":"warning","message":{"text":"RepositoryWatch::new (cognitive 19): RepositoryWatch::new has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (10 pts), boolean chains 3, loops 2 (3 pts), match/switch 1 (3 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/watch.rs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"57b9d635046272cfa824879cc7595edece0e36761f97507b7999bdc714e427fe"}},{"ruleId":"D2","level":"warning","message":{"text":"Metadata::update (cognitive 19): Metadata::update has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 3, match/switch 1 (2 pts), loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/metadata.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"a678a655a073b597178dd7bc37c53dedf17a6200366c2521f12f5b73f1763f28"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::git::diff::read (cognitive 19): muxy_server::git::diff::read has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 3 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/diff.rs"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"3926b6fd3a352201c169e7ff7925513ca76000f25a0d198542c07cbeacc85940"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_ui::webview::host::monitor (cognitive 19): muxy_ui::webview::host::monitor has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (15 pts), boolean chains 4 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/host.rs"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"fab13cfafcf0bb46e3f7add7cffd10104a82b04ca5905163e2e0c9ce5e58f31a"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous)::restore (cognitive 19): (anonymous)::restore has cognitive complexity 19 (threshold 15). Drivers by points: if/else 9 (14 pts), loops 2 (3 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":"crates/muxy-app-core/src/browser/element_picker.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f8713f237680209f342a804ce5aa2b61ba70b94ef843a641c9cbf080d674112"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::extension_server_call (cognitive 18): AppModel::extension_server_call has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (13 pts), match/switch 1 (3 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/calls.rs"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"36852c5a42a9ca4f34cf00de52a7d65f3a457bc2fac52873f4b185c79ce540ae"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::receive_event (cognitive 18): AppModel::receive_event has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (16 pts), boolean chains 1, match/switch 1 (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":2611}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c5f168a5275a5c4d00ab4989566f3459815c688ea88ee4675ca2b5b846c6b64"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::git_selection (cognitive 18): AppModel::git_selection has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (14 pts), match/switch 3 (4 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git.rs"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"5eed4f91e99ca9a1652ecc30e57f5ff2bbd7f30c4c6a553bb38316cf0a9c2be1"}},{"ruleId":"D2","level":"warning","message":{"text":"RowRenderer::row (cognitive 18): RowRenderer::row has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (11 pts), loops 2 (4 pts), boolean chains 3 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"0163731a9cd575ba6606c89c368ea3e670e709d609d518e45f4b6eae2032697d"}},{"ruleId":"D2","level":"warning","message":{"text":"Webview::handle (cognitive 18): Webview::handle has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (12 pts), boolean chains 3, match/switch 2 (3 pts) (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/mod.rs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9206b94eeb2cf14d2649b5579b2b4bdee535ec373457743a4395004b5d26f0"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::agents_panel::header_buttons (cognitive 18): muxy_app::views::agents_panel::header_buttons has cognitive complexity 18 (threshold 15). Drivers by points: if/else 16 (18 pts) (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/agents_panel.rs"},"region":{"startLine":358}}}],"partialFingerprints":{"codehealthFindingId/v1":"95db3c31eb1de9d794a85091540177473fb3c9df1143e6b5be1d81838536316b"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::tab_strip::drag::move_pointer (cognitive 18): muxy_app::views::tab_strip::drag::move_pointer has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 5, match/switch 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":"crates/muxy-app/src/views/tab_strip/drag.rs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2bf03162b79fc21ab0f9351ee89e8a8bbf202349762c798d389f1bd66ae3a4e"}},{"ruleId":"D2","level":"warning","message":{"text":"Target::file (cognitive 18): Target::file has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12 (17 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":"crates/muxy-app-core/src/opener.rs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"57744e06a32f6776a743347b9483b36f2bbb8368f77f2b9bcd74dd964f378fca"}},{"ruleId":"D2","level":"warning","message":{"text":"Core::synchronize (cognitive 18): Core::synchronize has cognitive complexity 18 (threshold 15). Drivers by points: if/else 4 (10 pts), match/switch 2 (5 pts), loops 3 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":611}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c3cc7d82d26c9fe78e3540e384a726e8e6f763c36b9077d2d270e0f29cd99ec"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_protocol::validate::validate_reply (cognitive 18): muxy_protocol::validate::validate_reply has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), boolean chains 5, loops 1 (2 pts), match/switch 1 (nesting depth added 5). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/validate.rs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a179ca397c544e46329aa5712d175be5195e34ce773b5b6ef19b335969cf0f8"}},{"ruleId":"D2","level":"warning","message":{"text":"Terminal::encode_mouse (cognitive 18): Terminal::encode_mouse has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), match/switch 4 (7 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-terminal/src/ghostty.rs"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa368fb7a448ba7f1b9db0a4a13dcfef8aafb8de204b20f0f7d5d52bde018be"}},{"ruleId":"D2","level":"warning","message":{"text":"TextElement::paint (cognitive 18): TextElement::paint has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (11 pts), boolean chains 5, loops 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":1866}}}],"partialFingerprints":{"codehealthFindingId/v1":"4309240abe8f4dbdbad4732ddf2c6fb763d375c91f08619d31dd11b9031875a4"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::submit_git_form (cognitive 17): AppModel::submit_git_form has cognitive complexity 17 (threshold 15). Drivers by points: if/else 14 (15 pts), boolean chains 2 (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":"crates/muxy-app/src/views/git.rs"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e92c1cd420819640cfbb0b914510f7340114ab197c987a88bc87e08028e211b"}},{"ruleId":"D2","level":"warning","message":{"text":"Editor::command (cognitive 17): Editor::command has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (16 pts), match/switch 1 (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":"crates/muxy-app/src/opener.rs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"25d6b0b0725bd69079113290b9be5b6e9cd62067f882e6c8c0d6d255d383edc1"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::repository_actions::prepare (cognitive 17): muxy_app::repository_actions::prepare has cognitive complexity 17 (threshold 15). Drivers by points: if/else 11, boolean chains 3, match/switch 2 (3 pts) (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":"crates/muxy-app/src/repository_actions.rs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff9e43ee2b525194c9992fa579991e4057c6be9f98f4f2635f6609aae66e4586"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::element::terminal (cognitive 17): muxy_app::views::terminal::element::terminal has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (9 pts), loops 4 (7 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ebbd2598ceb6208a883725fb87b4307fbb02bfa87d5984f7191557365dc299"}},{"ruleId":"D2","level":"warning","message":{"text":"ComposerStore::attach_prepared_image (cognitive 17): ComposerStore::attach_prepared_image has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (11 pts), match/switch 2 (4 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":"crates/muxy-app-core/src/composer/draft.rs"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"a72d50570eb148b924088171de2a71174ce8c48704c2e05136235c33c82dd2ea"}},{"ruleId":"D2","level":"warning","message":{"text":"Registry::reload (cognitive 17): Registry::reload has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (9 pts), loops 2 (3 pts), match/switch 2 (3 pts), boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/extensions/mod.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"8af122081e0f604dfa39f357f1588578ac9cf6a05b24bb89c5ff4bae0e58f67c"}},{"ruleId":"D2","level":"warning","message":{"text":"Project::sync_groups (cognitive 17): Project::sync_groups has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 4, loops 4 (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":"crates/muxy-app-core/src/groups.rs"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"959565073a84e07d5ebf8f96b8429223b5986b05902eaf395b2314f8e5b95674"}},{"ruleId":"D2","level":"warning","message":{"text":"AppState::merge_catalog (cognitive 17): AppState::merge_catalog has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (7 pts), boolean chains 5, loops 3, match/switch 1 (2 pts) (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/catalog.rs"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb40a1c42cbd6f98cdfba64754456f33febd5869985fb61f582bcd703f96f79d"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app_core::agent_sessions::parse::read (cognitive 17): muxy_app_core::agent_sessions::parse::read has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 2 (3 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":"crates/muxy-app-core/src/agent_sessions/parse.rs"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7e5f3237948eee753d62ecb6163ba76923b80aa1645e2f3142f3796792a6cbf"}},{"ruleId":"D2","level":"warning","message":{"text":"State::close_sessions (cognitive 17): State::close_sessions has cognitive complexity 17 (threshold 15). Drivers by points: if/else 3 (11 pts), loops 3 (6 pts) (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/state.rs"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b9ccf317b0ee9999515a0e7fbbf71094cebbd4a6db165dde93aa9f175a9c371"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::tui::keys::overlay (cognitive 17): muxy_cli::tui::keys::overlay has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 7 (13 pts), if/else 2 (4 pts) (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/tui/keys.rs"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3ac1c4b69bdf4d5b0f8fc090101840211ee5828b4133b85595ff4c480c8472b"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::ui::panes::scroll_position (cognitive 17): muxy_cli::ui::panes::scroll_position has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12 (15 pts), loops 1, match/switch 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/ui/panes.rs"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"92770acaa96517d59d1a21bd9a62a340f85b779f686cf6200581550cc26cd606"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::ui::tabs::strip (cognitive 17): muxy_cli::ui::tabs::strip has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (12 pts), loops 3, boolean chains 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/ui/tabs.rs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8c34ee98306012c302436dbfc9ee57685601075d4f035a039c620529971b83b"}},{"ruleId":"D2","level":"warning","message":{"text":"Registry::prepare_worktree_receipt (cognitive 17): Registry::prepare_worktree_receipt has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 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":"crates/muxy-server/src/git/worktree.rs"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"33721fd2ee4fe4d46621846470e9cdc1cd08898de9ab53b7d803931d644668ac"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::connection::forward_events (cognitive 17): muxy_server::connection::forward_events has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 4, loops 2 (3 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":"crates/muxy-server/src/connection/mod.rs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f48dbe277970e5487d5644708e024c85c196e9832d66a5096c568c2880f32ca"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_server::git::details::log (cognitive 17): muxy_server::git::details::log has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12 (15 pts), boolean chains 1, 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":"crates/muxy-server/src/git/details.rs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa0f4c034fbe7d045d6150a2653a1d082360f24b26760e9d9131f5463a9131db"}},{"ruleId":"D2","level":"warning","message":{"text":"Dialog::render (cognitive 17): Dialog::render has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 3 (4 pts), boolean chains 1, match/switch 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/dialog/view.rs"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"291716d0b692e249877ee7e05369141c509b60aad2102c2b12994c1157120320"}},{"ruleId":"D2","level":"warning","message":{"text":"Page::pointer_target (cognitive 17): Page::pointer_target has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (13 pts), boolean chains 2, match/switch 2 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/linux/page/input.rs"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"323c04e5e2ab03af1d6d27dbe4615915ac6b012243117954523d5fd713bef141"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous)::open (cognitive 17): (anonymous)::open has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 3, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2ce18f5779b217410d8d83e8aa5d38a65dcfb60c9f22aa4aa62495823695816"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::ai_availability (cognitive 16): AppModel::ai_availability has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (12 pts), match/switch 2 (3 pts), boolean chains 1 (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":"crates/muxy-app/src/model/ai.rs"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"e66adfd0b8483520515d165f5a2d2bd5f9f622c856a7627b2f649ff4ae9abb44"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::sync_extension_file_watches (cognitive 16): AppModel::sync_extension_file_watches has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (12 pts), loops 3 (4 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/events.rs"},"region":{"startLine":504}}}],"partialFingerprints":{"codehealthFindingId/v1":"20d6111d8b02999ff814e5ea0e8be3c0b2e4d3abbb5c0247d75918b2e973544e"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::workspaces_call (cognitive 16): AppModel::workspaces_call has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), loops 1 (2 pts), match/switch 1 (nesting depth added 6). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/workspace.rs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc6ae3f6790ce267613d3d661cd7f6bd3efbd0737f11d8e0f6d4490be76a9196"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::open_terminal_link (cognitive 16): AppModel::open_terminal_link has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 3, 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":"crates/muxy-app/src/model/links.rs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"44e389b9da5892134effbabf5001938a2d3924bb4eb20d65b2098f5c5b2672ff"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::terminal_menu (cognitive 16): AppModel::terminal_menu has cognitive complexity 16 (threshold 15). Drivers by points: if/else 14, boolean chains 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":"crates/muxy-app/src/model/links.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"b961efad3a6928ab6c15aed6f555a88624146b85568ec944178ccacc3ed2ea37"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::dispatch_webview (cognitive 16): AppModel::dispatch_webview has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (11 pts), match/switch 2 (3 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":"crates/muxy-app/src/model/webviews.rs"},"region":{"startLine":493}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfd5c48bd3ba34f2291a9895b7f48fc193a90d3805abb621d6380f91755fa353"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::perform_server_menu (cognitive 16): AppModel::perform_server_menu has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (8 pts), match/switch 4 (7 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":"crates/muxy-app/src/views/server_menu.rs"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"526e15229ace171dd0a84e5ac7228cc32c11c0cc5eb82d38ede91d73079bddc7"}},{"ruleId":"D2","level":"warning","message":{"text":"AppModel::webview_panel_space (cognitive 16): AppModel::webview_panel_space has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/panel.rs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"93054c69c2dc7781d24f10eb188bb3412a158ab37b94688f10db2f68be1a3ce8"}},{"ruleId":"D2","level":"warning","message":{"text":"SettingsView::categories (cognitive 16): SettingsView::categories has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 4, loops 2 (4 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/layout.rs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"7afd869a5918240a8f588e44e0aea0f2df8a868fd8b5280d69853b8f5e7f59c1"}},{"ruleId":"D2","level":"warning","message":{"text":"TerminalPane::mouse_wheel (cognitive 16): TerminalPane::mouse_wheel has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 2, loops 1 (2 pts), match/switch 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":915}}}],"partialFingerprints":{"codehealthFindingId/v1":"650dfaee402a2ee196da0ad08b66235976f5e192979f33d1bd5a9e1bf1c02060"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::settings::backup::rows (cognitive 16): muxy_app::views::settings::backup::rows has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 3 (5 pts), boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/backup.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ed2f21328fcd9422852c9cd3fd8a8f079fb4413838a0a0d864edc8f75c2728"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_app::views::terminal::input::key_event (cognitive 16): muxy_app::views::terminal::input::key_event has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11 (12 pts), boolean chains 4 (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":"crates/muxy-app/src/views/terminal/input.rs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bcdfc3fad82389e0fe42dc26b6b203a1a3d724c55e43fcac6196acf13aa05ab"}},{"ruleId":"D2","level":"warning","message":{"text":"Node::dock (cognitive 16): Node::dock has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (9 pts), match/switch 3 (4 pts), boolean chains 2, 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":"crates/muxy-app-core/src/layout/docking.rs"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"88ab8c8120184669db84597eefcc291b9afa48996e2540efc0194e3ec6bc3008"}},{"ruleId":"D2","level":"warning","message":{"text":"Options::parse (cognitive 16): Options::parse has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 2, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/manage/args.rs"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"09b680ecc3aaa83e92a2fe9d4fa7df620d564609c31ceda03f642edb977d5a94"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::tui::mouse::wheel (cognitive 16): muxy_cli::tui::mouse::wheel has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 1 (nesting depth added 7). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/tui/mouse.rs"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5ec383ef27be8ee3a8a6d4ec6dd877fce25a59432e04094d4a8838b184e83b9"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_cli::worker::apply (cognitive 16): muxy_cli::worker::apply has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, match/switch 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":893}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc1b4250e20b42a3c182d182fb2e3e17212a9a3422d0a29b8d281927425f65d9"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_protocol::validate::validate_request (cognitive 16): muxy_protocol::validate::validate_request has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (15 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":"crates/muxy-protocol/src/validate.rs"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8caac4c9bcbe1aae96cd4862e2c814667dc0661ac7a5d0515d78f2b9e18d8f7"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_ui::quick_terminal::platform::linux::shortcut::registrations (cognitive 16): muxy_ui::quick_terminal::platform::linux::shortcut::registrations has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 3 (4 pts) (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/quick_terminal/platform/linux/shortcut.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"8db52425f82b29edc4e60284855e3d2b2066f364a44a1766e3398fb2cddc206c"}},{"ruleId":"D2","level":"warning","message":{"text":"muxy_ui::voice::linux::collect (cognitive 16): muxy_ui::voice::linux::collect has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (12 pts), match/switch 1 (3 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/voice/linux.rs"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"7db7eb93f81e04e8eb698e3e9d3db9a88ddcd680690aa9150b36543a5c5bba76"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AppModel: TooManyMethods \u2014 912 methods, declared across 83 files: src/model.rs (90), model/webviews.rs (37), extensions/mod.rs (33), model/servers.rs (32), \u002B79 more file(s). The bar is 30 methods; this is 882 over it, 30.40\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdcd4738dce5a8b18b4189eb12faeb24ff8d2219da4d36326eecf1c57f111a96"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AppModel: ClassTooLong \u2014 2016 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 912 methods, 3 blocks, lines 111-2799. The bar is 400 significant lines; this is 1616 over it, 5.04\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"3549b7fc6c19bdb0b7525ede2a84d118a686a7c7602eef4248e5cc7987b00c89"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AppState: TooManyMethods \u2014 137 methods, declared across 10 files: src/state.rs (57), src/servers.rs (18), src/catalog.rs (16), src/workspace.rs (15), \u002B6 more file(s). The bar is 30 methods; this is 107 over it, 4.57\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/state.rs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2656c8429881801563a7381d4b57f4c3b69d44eeb03198a5d99d09ecc81c3a9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/model.rs: FileTooLong \u2014 2106 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 96% of them inside a single declaration: AppModel (3 blocks, 111-2799). The bar is 500 significant lines; this is 1606 over it, 4.21\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8f24e34456420ee66734a49f6db9fb88498ea359b2d5c1f5b37921b27bcc610"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: AppModel: TooManyFields \u2014 105 stored fields beside 912 methods. The bar is 30 stored fields; this is 75 over it, 3.50\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"55440a8b85d0cb159210060cf0f27dee8b7c7e092011eebac465107db9f8c92c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/picker.rs: FileTooLong \u2014 1669 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 65% of them inside a single declaration: Picker (5 blocks, 776-2180). The bar is 500 significant lines; this is 1169 over it, 3.34\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f652ba604512d46fbf3b2e5d5dad2cafcf0a756848418a66e44e3a419d868aea"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TerminalPane: TooManyMethods \u2014 95 methods, declared across 6 files: terminal/pane.rs (68), terminal/find.rs (10), terminal/scrollbar.rs (8), terminal/cursor.rs (4), \u002B2 more file(s). The bar is 30 methods; this is 65 over it, 3.17\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a067bc692fa9748007ed69dfbd99c42807125ea0a6cd8eb96ea0f509cc06723"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TextInput: TooManyMethods \u2014 90 methods. The bar is 30 methods; this is 60 over it, 3.00\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"83526e68993869ddd501b498dcd8ae10fcaef9f0e46967a76ef8d62b20135f56"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ExtensionsView: ClassTooLong \u2014 1165 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 45 methods, 4 blocks, lines 83-1582. The bar is 400 significant lines; this is 765 over it, 2.91\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/extensions.rs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"7be36f825ec95324bcbe1430c2aefbcf5bd003a8b6f3a7b8614780d05f5cdaab"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/text_input.rs: FileTooLong \u2014 1443 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 943 over it, 2.89\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fadd2a5cac39f0e738b7737484738e2c0d3c32b2787c8265b885522d87471379"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Picker.render_item: MethodTooLong \u2014 render_item runs 281 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 181 over it, 2.81\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"3696c63a17aa8cbc86cc38a0d4fb34fc5a2b46b443041ee0c0f33d4c4c97d6fb"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Client: TooManyMethods \u2014 83 methods, declared across 6 files: src/client.rs (48), src/catalog.rs (17), src/asynchronous.rs (8), src/remote.rs (8), \u002B2 more file(s). The bar is 30 methods; this is 53 over it, 2.77\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-client/src/client.rs"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"0689b4b4a888f777b05f47dc248ab0d7e812ab58c45211c174c2436304c0f334"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Picker: ClassTooLong \u2014 1085 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 46 methods, 5 blocks, lines 776-2180. The bar is 400 significant lines; this is 685 over it, 2.71\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cb8dd4fa99db08ab3a646777e5e9cafad350b416a1efda1bb0967452242beb5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: linux/page.rs: FileTooLong \u2014 1309 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 48 free functions. The bar is 500 significant lines; this is 809 over it, 2.62\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/linux/page.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c37f7e594bcf1a85ce8029a85fb0a648a431a686e71d97b9702fe2081756c0e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: settings/extensions.rs: FileTooLong \u2014 1239 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 94% of them inside a single declaration: ExtensionsView (4 blocks, 83-1582). The bar is 500 significant lines; this is 739 over it, 2.48\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/extensions.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13d980868c4d86d3ae2f75cd15feb312c7d9bc2e18e2e435939b4ad933a5a768"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Registry: TooManyMethods \u2014 73 methods, declared across 5 files: src/registry.rs (58), git/worktree.rs (11), git/mod.rs (2), files/mod.rs (1), \u002B1 more file(s). The bar is 30 methods; this is 43 over it, 2.43\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/registry.rs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"178c699d696f1ad9925dbcf48dc640a067f7d68de5416c015d2a7739c7267eb3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/shortcuts.rs: FileTooLong \u2014 1190 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 690 over it, 2.38\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-core/src/shortcuts.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d628e058f0bc89503ca3a301b97a7347a9172df42960bc86c0cf9662061a537"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/remote_servers.rs: FileTooLong \u2014 1182 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 682 over it, 2.36\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/remote_servers.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cc380a4a05981e7b6103c35910db864d026f9e3f42b8992888a90ff4f35a0cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_cli::browser::args::invocation: FunctionTooLong \u2014 muxy_cli::browser::args::invocation runs 236 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 136 over it, 2.36\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/browser/args.rs"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"f34beb1a07eb3b02b8a33278c125042ffbc79aa15e2e06724aa812daaf7f8e4a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppModel.receive_git: MethodTooLong \u2014 receive_git runs 235 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 135 over it, 2.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/git.rs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cb686acf2f1109dd9ac2b94ef650d95b08e30eb39b830629060f0fa23604b05"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: terminal/pane.rs: FileTooLong \u2014 1171 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 671 over it, 2.34\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b203c795667c85039ca1de01e8659e19616018875651183b2db473b901dd81c2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SettingsView: TooManyMethods \u2014 65 methods, declared across 11 files: settings/mod.rs (24), settings/layout.rs (9), settings/terminal_lists.rs (8), settings/results.rs (7), \u002B7 more file(s). The bar is 30 methods; this is 35 over it, 2.17\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/mod.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"65333cb6b7963713290f9f6079aaf3539533213ad2022b6387cbaca19faabd95"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model/webviews.rs: FileTooLong \u2014 1034 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 90% of them inside a single declaration: AppModel (5 blocks, 92-1345). The bar is 500 significant lines; this is 534 over it, 2.07\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/webviews.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"89118e6736e0f31c531b8fc7761ebf41ada44ab9090e0e6e380530fb2e12e63a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppModel.apply_preference: MethodTooLong \u2014 apply_preference runs 202 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 102 over it, 2.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/preferences.rs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b647e8a636f9d458e3ce54e1ba2a914cdd787246f78048cd2ed830e3d82a771"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AppState: ClassTooLong \u2014 805 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 137 methods, 3 blocks, lines 20-1098. The bar is 400 significant lines; this is 405 over it, 2.01\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/state.rs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad307ed7cdddafe35283673264efbe1d154312979087391dae29fd9f8b949b5e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/boot.rs: FileTooLong \u2014 961 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 461 over it, 1.92\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/boot.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cc4fd0f06d581e3a3f7e3aff5dae70912264e597156016f32f632d40fb6285e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Picker.render: MethodTooLong \u2014 render runs 190 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 90 over it, 1.90\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":1924}}}],"partialFingerprints":{"codehealthFindingId/v1":"f978a7f6abff5a3b40312eee367d3fbc6569cea81c7e6e67f78526fee1c1147b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TextInput: ClassTooLong \u2014 752 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 90 methods, 6 blocks, lines 513-1978. The bar is 400 significant lines; this is 352 over it, 1.88\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c831702b7175475162af002b3a437055a1a98c4d049646fb2f6cb93f840df75"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppModel.new: MethodTooLong \u2014 new runs 185 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 85 over it, 1.85\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":443}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc804e00db2cab040e96f504d801cf9c34fd3d0db1da5142b38725238cb35976"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TextElement.prepaint: MethodTooLong \u2014 prepaint runs 185 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 85 over it, 1.85\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":1627}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6618ee192e9aea6d056a00e7ddc66fb7e0aaee76cebe25a44b4ee99421a13c0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/workspace.rs: FileTooLong \u2014 884 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 384 over it, 1.77\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/workspace.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85a9f66f90089f50576968fc07671cf6884092e064e28e77d1767658e76e5722"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::settings::terminal::rows: FunctionTooLong \u2014 muxy_app::views::settings::terminal::rows runs 174 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 74 over it, 1.74\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/terminal.rs"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"896ce2f6047bafe8cd62736d9ab99c07ea6b3b0e486188f98025ffc900ca4efe"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: TerminalPane: TooManyFields \u2014 52 stored fields beside 95 methods. The bar is 30 stored fields; this is 22 over it, 1.73\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"9463e1ee07dcd1ee05686413a37c63d03500ddfe3476d116bd9f667626559f22"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: QuickTerminalView.render: MethodTooLong \u2014 render runs 172 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 72 over it, 1.72\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/quick_terminal.rs"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c116283d5babaf9b4f8feafc87bdac97f1f576f19397d07f9e8fe2c1d8260e0"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: GitRepository: TooManyMethods \u2014 51 methods, declared across 3 files: git/repository.rs (34), git/pull_requests.rs (9), git/worktrees.rs (8). The bar is 30 methods; this is 21 over it, 1.70\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-mobile/src/git/repository.rs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"d88b783db7ad21ae43b5349471901cc2b9892ba7217868dd532862249a4b8552"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/state.rs: FileTooLong \u2014 844 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 95% of them inside a single declaration: AppState (3 blocks, 20-1098). The bar is 500 significant lines; this is 344 over it, 1.69\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/state.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbdbb093bcd779016316a701b657d89f31c136637a6126f51e0bc30042d59e14"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/agents_panel.rs: FileTooLong \u2014 841 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 341 over it, 1.68\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/agents_panel.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7daaeae9e995ed7871292a44581ce5094caad4b6495e2376f03da4d14267f7fb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/sidebar.rs: FileTooLong \u2014 829 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 329 over it, 1.66\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/sidebar.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"970de6ebfabe51f143707113916163130570ca6e06523b8b778e56de0d07b426"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::settings::appearance::rows: FunctionTooLong \u2014 muxy_app::views::settings::appearance::rows runs 163 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 63 over it, 1.63\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/appearance.rs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"c382ae403bf26a8de7f7b9757eeda6d5217f36fdc8f20aa05e135eeebf9729d2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: terminal/element.rs: FileTooLong \u2014 807 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 307 over it, 1.61\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a34a7e8da147adc18d35d36ed3a9564d54b0b3decacd1048c2c2973b014510b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_server::connection::reader::ordered_request: FunctionTooLong \u2014 muxy_server::connection::reader::ordered_request runs 157 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 57 over it, 1.57\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/reader.rs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c9eb9c98fe48a20b5c36996d8cb48503fca838aaae2b53033e4d9b955afa7ce"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/project_picker.rs: FileTooLong \u2014 782 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 282 over it, 1.56\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/project_picker.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e793c933e1ae288dbe712b95c0c622e37de45b9b388057f6ec6b5162a08a540"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model/preferences.rs: FileTooLong \u2014 777 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 88% of them inside a single declaration: AppModel (42-954). The bar is 500 significant lines; this is 277 over it, 1.55\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/preferences.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf0f203d5c6f98affe28d66a0e048566415f93039c290481cc4899d06e2df05c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: platform/macos.rs: FileTooLong \u2014 777 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 277 over it, 1.55\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/quick_terminal/platform/macos.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa42087f65652b534ea871e48aa3b606d50bd8c135071f3090b75b8419186171"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BrowserView: ClassTooLong \u2014 619 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 33 methods, 4 blocks, lines 104-1021. The bar is 400 significant lines; this is 219 over it, 1.55\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2a795c346bbfd0bbb0c12e9969822216c2fc76f0d14926e210c39d23671a69f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/worker.rs: FileTooLong \u2014 769 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 66% of them inside a single declaration: Core (2 blocks, 213-889). The bar is 500 significant lines; this is 269 over it, 1.54\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"95966e53b613d706a52cce41f480447576a2e8f108a42cfc90e0c9dfbf02a35b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: browser/mod.rs: FileTooLong \u2014 767 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 81% of them inside a single declaration: BrowserView (4 blocks, 104-1021). The bar is 500 significant lines; this is 267 over it, 1.53\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"feb9c27b6e609013aa144671ca69239d2a43cc55b2045d401514037b4e844094"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Picker: 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":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":776}}}],"partialFingerprints":{"codehealthFindingId/v1":"7be03fac41ad279a18247d6d9ee27c6b94681622e66eedc400df7443510f5a3d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::overlays::layer: FunctionTooLong \u2014 muxy_app::views::overlays::layer runs 152 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 52 over it, 1.52\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/overlays.rs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"d17363211314120b9bb28a202a7f4bb4902753aa035cf14597019f2d16975c6c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::sidebar::project_row: FunctionTooLong \u2014 muxy_app::views::sidebar::project_row runs 152 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 52 over it, 1.52\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/sidebar.rs"},"region":{"startLine":716}}}],"partialFingerprints":{"codehealthFindingId/v1":"767356bbf819560601d083ab6e5fc7c5f94510b694b7537b8ac5d5bc11bbad6a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::boot::perform: FunctionTooLong \u2014 muxy_app::boot::perform runs 151 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 51 over it, 1.51\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/boot.rs"},"region":{"startLine":976}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b019133eafcaa4138847c8ca7e44bc246e7fb19d649f9e52a145f100a1874a7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ExtensionsView: TooManyMethods \u2014 45 methods, declared across 3 files: settings/extensions.rs (37), extensions/configuration.rs (4), extensions/updates.rs (4). The bar is 30 methods; this is 15 over it, 1.50\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/extensions.rs"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"2625603cfc3d33c3f21a4f122749c9f0e4e04691c2bf182c5208d44c5dd3238f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Registry: ClassTooLong \u2014 598 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 73 methods, 2 blocks, lines 46-845. The bar is 400 significant lines; this is 198 over it, 1.50\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/registry.rs"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef04c6e7d2168f20e42461e1c3f43f29adf42ee42a6239f4d5d3e8f8fcc77e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: settings/catalog.rs: FileTooLong \u2014 732 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 232 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":"crates/muxy-app/src/views/settings/catalog.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6383f97b790cc66389bf7b9e71047a3afd7b604a13b10b770195437653a74a32"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model/composer.rs: FileTooLong \u2014 715 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 81% of them inside a single declaration: AppModel (3 blocks, 67-930). The bar is 500 significant lines; this is 215 over it, 1.43\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/composer.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d8ba7dcce81f7dff1f7a2a77a9492ed52778a1d8e69e22b75d6f9bf215e72a3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: session/owner.rs: FileTooLong \u2014 704 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 75% of them inside a single declaration: Owner (2 blocks, 79-899). The bar is 500 significant lines; this is 204 over it, 1.41\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/owner.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4734974be60ffb72e6c77b67742913de8985da70e0654c1e9090d350b64e1ba"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SettingsWindow: ClassTooLong \u2014 563 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 18 methods, 3 blocks, lines 53-814. The bar is 400 significant lines; this is 163 over it, 1.41\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/window.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d8084b99e55e49c6641a532445de2fb851d80bb99bdd5f9930877238b0f7ba1"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppModel.receive: MethodTooLong \u2014 receive runs 140 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 40 over it, 1.40\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":2157}}}],"partialFingerprints":{"codehealthFindingId/v1":"2803fef8aa3bf1238557f8592816e5206b2665ae28132d726bf973e2cda80bc9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: composer/layout.rs: FileTooLong \u2014 693 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 96% of them inside a single declaration: Composer (37-852). The bar is 500 significant lines; this is 193 over it, 1.39\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/composer/layout.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b6e4412bd9fd348e0670565c54960c797cf3263cf30100bb8dbd9d2d283f02a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/ghostty.rs: FileTooLong \u2014 693 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 79% of them inside a single declaration: Terminal (2 blocks, 82-786). The bar is 500 significant lines; this is 193 over it, 1.39\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-terminal/src/ghostty.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"15e9426207e199ca7b59f750c6e73fb43ff6471f2c241420f336e3ef6e782f4e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: settings/mod.rs: FileTooLong \u2014 684 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 184 over it, 1.37\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6901b7eec2490eb651aac60b2234a01e8c96ca1d4f9846d0d264c686b49d590c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NativeBrowser: TooManyMethods \u2014 41 methods. The bar is 30 methods; this is 11 over it, 1.37\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/linux/browser.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7b250ba4e49c4eed42834625f523a2912607446eea48eb37097b9dcde07ca81"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Page: TooManyMethods \u2014 41 methods, declared across 4 files: linux/page.rs (20), page/browser.rs (13), browser/cookies.rs (5), page/input.rs (3). The bar is 30 methods; this is 11 over it, 1.37\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/linux/page.rs"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6aedf489ec1876d7bd9df166a08958ed27a49baf7ea164448da20157cff5164"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Terminal: ClassTooLong \u2014 546 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 35 methods, 2 blocks, lines 82-786. The bar is 400 significant lines; this is 146 over it, 1.37\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-terminal/src/ghostty.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c204631744dbcfada421ed9810f7675f88ca16b7bf594f9d917b0dbcb5a9b08"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: extensions/mod.rs: FileTooLong \u2014 682 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 80% of them inside a single declaration: AppModel (189-946). The bar is 500 significant lines; this is 182 over it, 1.36\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bad0359acdbe9d86a5bf0d618cd650c6e8b0c05e3a5cdabf897d0b070f4cd8a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/tab_sidebar.rs: FileTooLong \u2014 681 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 181 over it, 1.36\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/tab_sidebar.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbce7ac0bd9931de3a49107d5678709385099455c9d2b99d1c28c5a7d8fc499f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model/remote_servers.rs: FileTooLong \u2014 679 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 75% of them inside a single declaration: AppModel (272-1004). The bar is 500 significant lines; this is 179 over it, 1.36\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/remote_servers.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"004a88a68790d365982ca972848b2cfff3883db091ec194ef078ae4de5ef4d75"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/samples.rs: FileTooLong \u2014 676 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 176 over it, 1.35\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/samples.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"229a294b5af2082162dfc22f0de3ca2a0becda0312c0eedb8624fc0cab41d3cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/panel.rs: FileTooLong \u2014 676 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 176 over it, 1.35\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/panel.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5fd84da94c1408844c364880aa449331d4b0409a967656f68e6f228a86a5d9c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::git::form::render: FunctionTooLong \u2014 muxy_app::views::git::form::render runs 134 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/form.rs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bb7f900744a852a3c006b545f666f3bd62351639dca47cf182d2ee5d4c709eb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppModel.perform_menu: MethodTooLong \u2014 perform_menu runs 133 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 33 over it, 1.33\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/menu.rs"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"feeccd7bfd30b344478c15cd7b2cac7c393a5056f6d49eea338459b0bb0d236f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Owner: ClassTooLong \u2014 529 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 18 methods, 2 blocks, lines 79-899. The bar is 400 significant lines; this is 129 over it, 1.32\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/owner.rs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec2939bc828ecc98e91414613bebd1f31f4714837d367cc87f2bbdd6fc4e3b3d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::boot::worker: FunctionTooLong \u2014 muxy_app::boot::worker runs 131 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/boot.rs"},"region":{"startLine":542}}}],"partialFingerprints":{"codehealthFindingId/v1":"8608691db320fad18bee0f75e9b92e6423130a25a64f140074280d6b48ffcd46"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::workspace::action_handlers: FunctionTooLong \u2014 muxy_app::views::workspace::action_handlers runs 131 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/workspace.rs"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"8722cd21585556f191a1a5717b7328d011fec755ec2ddc1a65aa9bc1646d0f5a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/registry.rs: FileTooLong \u2014 651 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 92% of them inside a single declaration: Registry (2 blocks, 46-845). The bar is 500 significant lines; this is 151 over it, 1.30\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/registry.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa0501bd04d812cafded6d37ad8e8cb7b6f20acc275e9b211df250cbb46e03d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::settings::quick_terminal::rows: FunctionTooLong \u2014 muxy_app::views::settings::quick_terminal::rows runs 130 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 30 over it, 1.30\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/quick_terminal.rs"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"cca525ec688fd918d796e5b1758bca0c1564d10b577225129f9b8cd65ed56cad"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: dialog/prompt.rs: FileTooLong \u2014 649 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 149 over it, 1.30\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/dialog/prompt.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86a820a3f7af90b995b4cd6811891be83418b5cf2b2c85ead45cedccbde3246c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: git/github.rs: FileTooLong \u2014 644 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 77% of them inside a single declaration: Github (2 blocks, 14-621). The bar is 500 significant lines; this is 144 over it, 1.29\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/github.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c1b085857065faf76c76cf94b6811abd89ea835a614ff7ccad3cf98a86c6fe1"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::git::ai_provider::render_provider_menu: FunctionTooLong \u2014 muxy_app::views::git::ai_provider::render_provider_menu runs 128 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 28 over it, 1.28\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/ai_provider.rs"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"945d3a004235fd5c6a25c0c5fc58ad6402a9b0ab57da7f36153074ff1201b4ca"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Core: ClassTooLong \u2014 509 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 22 methods, 2 blocks, lines 213-889. The bar is 400 significant lines; this is 109 over it, 1.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":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd63cf472a2c4eedd43ab16ceaa535c7a4cf50b478efcf6fdb72826ff144ddcf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: extensions/workspace.rs: FileTooLong \u2014 632 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 91% of them inside a single declaration: AppModel (88-812). The bar is 500 significant lines; this is 132 over it, 1.26\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/workspace.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bdc90d3250edbe1653a7312305b421a4b561fba15893b7b5d9e3a337bc744e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: backup/projects.rs: FileTooLong \u2014 622 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 122 over it, 1.24\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dee588ac2e716b4939e5fafe79f6ecbab85303e74488c2bdf8d35dd43d7788fb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: extensions/manifest.rs: FileTooLong \u2014 619 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 119 over it, 1.24\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/extensions/manifest.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"529aa6e57d0c3219412146ed16efc21ab10d60721e927f203afc34485ea789f5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Outbox: TooManyMethods \u2014 37 methods. The bar is 30 methods; this is 7 over it, 1.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/outbox.rs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2f55f7c9347cc3c49bfb63f13c13a69e342d6f7558f3965fada2d2aa405db64"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: Appearance: TooManyFields \u2014 37 stored fields beside 3 methods. The bar is 30 stored fields; this is 7 over it, 1.23\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/appearance.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fe05b5c91afaa73de8d271c42f1faa0df36ec10d33a66da578ab6f067e08858"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Github: ClassTooLong \u2014 493 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 14 methods, 2 blocks, lines 14-621. The bar is 400 significant lines; this is 93 over it, 1.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/github.rs"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6976c5229bc5b44f428af4f7c718c4bde100001003f95116cfc659e190c27717"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: extensions/calls.rs: FileTooLong \u2014 616 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 86% of them inside a single declaration: AppModel (11-714). The bar is 500 significant lines; this is 116 over it, 1.23\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/calls.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"268a71ac64493b1025921ba64396b93134776bd862ca1f51eaffc067ddba9d11"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: settings/terminal.rs: FileTooLong \u2014 610 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 110 over it, 1.22\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/terminal.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e140e90bdbb6bae4d485287272105dccf975d987bd009a370afe24b4496246bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::terminal::element::terminal: FunctionTooLong \u2014 muxy_app::views::terminal::element::terminal runs 122 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 22 over it, 1.22\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da60403734b91a3fa0300bdc716c1b90640bf7e022d1d850634f6564c0ad4a7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Catalog: TooManyMethods \u2014 36 methods, declared across 6 files: catalog/sessions.rs (12), catalog/mod.rs (10), catalog/git.rs (7), catalog/mutations.rs (4), \u002B2 more file(s). The bar is 30 methods; this is 6 over it, 1.20\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/catalog/mod.rs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"72fb04f1f10101fa5e482eba68613d00601fff1377826f0571844bb19ff4a37b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: settings/window.rs: FileTooLong \u2014 600 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 94% of them inside a single declaration: SettingsWindow (3 blocks, 53-814). The bar is 500 significant lines; this is 100 over it, 1.20\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/window.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7225a30c168156d1709e79e0bbbb228ed074fc7d22f210b839c8ed2d5b232f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::terminal::element::prepare: FunctionTooLong \u2014 muxy_app::views::terminal::element::prepare runs 119 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 19 over it, 1.19\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1ec11a5dca314d22162e8f5ae9b935021d3f090ae60ca22bfefdeeb030d6f5f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/servers_tab.rs: FileTooLong \u2014 594 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 94 over it, 1.19\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/servers_tab.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb96f8b33f5bb03beebbe108d3a192392be7d52d997594283a797c823b583901"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/git.rs: FileTooLong \u2014 591 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 85% of them inside a single declaration: AppModel (71-732). The bar is 500 significant lines; this is 91 over it, 1.18\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"faf0dfc7fc73b40a0263a0a5a86d5aa6756e83c77dc3f713940b07f4d7174864"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppModel.request_pull_request_action: MethodTooLong \u2014 request_pull_request_action runs 117 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 17 over it, 1.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/pr.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"017a292d1e6e88e203e412e9104e00745f37b4afd0923a8fd7784dc283ad3684"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: SettingsView: TooManyFields \u2014 35 stored fields beside 65 methods. The bar is 30 stored fields; this is 5 over it, 1.17\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/mod.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3b3fb0650f2e010047afa0639774ac82476edcc51a267d6cbf5a1ae79418202"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Terminal: TooManyMethods \u2014 35 methods. The bar is 30 methods; this is 5 over it, 1.17\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-terminal/src/ghostty.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e5110b00e8fceae9f5ea095eebb71a28f8151194caeee5e730128197128d1d7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: webview/host.rs: FileTooLong \u2014 581 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 81 over it, 1.16\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/host.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ba16cc4ff2fa1332957751068f2803d7087bd3b995e7fc636cc894118ccce83"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::tab_strip::tab_cell: FunctionTooLong \u2014 muxy_app::views::tab_strip::tab_cell runs 116 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/tab_strip.rs"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"868a69bb0be6fc9cea04c3397fa8e357915e976970a7dbd33261dc89803c54ca"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: PromptTarget.new: MethodTooLong \u2014 new runs 114 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/dialog/prompt.rs"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"f16e10f98c9a6ee55bd4e9cf37fb117c883097d367d6db6ea2cb34a946df4134"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: git/pr.rs: FileTooLong \u2014 558 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 58 over it, 1.12\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/pr.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7490abbdb74b2c003d00ca7dfca21ab9a1259a9f2294edc9a14fed3b0b979881"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/state.rs: FileTooLong \u2014 556 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 63% of them inside a single declaration: State (2 blocks, 19-515). The bar is 500 significant lines; this is 56 over it, 1.11\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/state.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb4f5bc92f4dab36bb02e2326685366414109cf83cec755f86f738bdc48b4656"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppModel.dispatch_extension: MethodTooLong \u2014 dispatch_extension runs 111 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/calls.rs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c7e64c9f78cda3f842fbee97cf7def8e2a6eccdbbd0ee8d07537ea28bb5e36e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BrowserView: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f57ee3c72ab3f813e8fc295b6a3bdf056235cd090fea42c3c629c88dc28a3c7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: Owner: TooManyFields \u2014 33 stored fields beside 18 methods. The bar is 30 stored fields; this is 3 over it, 1.10\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/owner.rs"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c5d2dcd58e4fd43901839a7a0dd84022fed6f65b3fcb75f152887fd72c52427"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: AppState.restore_configuration: MethodTooLong \u2014 restore_configuration runs 108 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dbceeab795ce6a9c7729a0a36112cec9b82495ab74e45113f684287270f7f9d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: git/records.rs: FileTooLong \u2014 535 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 35 over it, 1.07\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-mobile/src/git/records.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccb4b4fd990768e17241520a9670e837da7c7c0e27d7a1a356b0c66e465432d9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TerminalSettings.read_source: MethodTooLong \u2014 read_source runs 107 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"08ad4c53d89070f13f589b1f3bd63a01678feab041ef5e7a95b3436ff2300fa8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::menus: FunctionTooLong \u2014 muxy_app::menus runs 107 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/main.rs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f90ef8478319a8ce2a98a4fd44af54fd681c801d5ea80efb797be3d9d8407e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SettingsWindow.backup_action: MethodTooLong \u2014 backup_action runs 107 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/backup.rs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"44ab463cdba136bb187dc4bcfd148f7d79bb01ddf63c7931ee260603268f4968"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::tab_sidebar::tab_row: FunctionTooLong \u2014 muxy_app::views::tab_sidebar::tab_row runs 107 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 7 over it, 1.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/tab_sidebar.rs"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"f99cf62eb9d02e66ab84417e9a5ce8dc4cd547a7afb9c12b2c5c2b89d219614e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Composer: TooManyMethods \u2014 32 methods, declared across 3 files: composer/layout.rs (16), views/composer.rs (14), composer/menu.rs (2). The bar is 30 methods; this is 2 over it, 1.07\u00D7 the bar. That list is where to read them, not a suggestion to split the file: the members belong to the type wherever they are declared, so moving them between files leaves the count unchanged. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/composer.rs"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"c502da10f1658ad3bc9683a50760d475ba69b1911dcf975beb7740fa250086bc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/menu.rs: FileTooLong \u2014 531 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 31 over it, 1.06\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/menu.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd26c5dc0ed746d888fe2eb5169767d54eacccd8fdf5a2ff4ee07f3f9ec3b910"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TerminalSettings.save: MethodTooLong \u2014 save runs 106 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty.rs"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"04715917bda71854a9d75e471c589ee7dbee5b553b6cd84743205ebe7cdf3530"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/quick_terminal.rs: FileTooLong \u2014 529 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 66% of them inside a single declaration: QuickTerminalView (4 blocks, 33-673). The bar is 500 significant lines; this is 29 over it, 1.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":"crates/muxy-app/src/views/quick_terminal.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9da375d09ea1f3868afc74096dea6486893365f68236884d00c7d7bef2f3e2c1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/repository_actions.rs: FileTooLong \u2014 527 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 27 over it, 1.05\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/repository_actions.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"16ed96f7b9ba595c8704aca5fbe4ea4ae43a298569d93a23e29a4551e82b0c33"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/tab_activity.rs: FileTooLong \u2014 527 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 27 over it, 1.05\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/tab_activity.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d31dc3ed6cd56cb10d8786125fac5ceff78daaf23df5cff5a1ef488a7a66414"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: muxy_app::views::terminal::element::paint: FunctionTooLong \u2014 muxy_app::views::terminal::element::paint runs 105 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 5 over it, 1.05\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc726b0a6b66327526738927e1e771320470d554e5bcfff2cd63d875d7268027"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: views/status_bar.rs: FileTooLong \u2014 522 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 22 over it, 1.04\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/status_bar.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"31cb1ce5ba1f9f6c9b57bcf3e53368fa1fd1d2edd766f235a47bd871fcecb23b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model/git.rs: FileTooLong \u2014 513 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 80% of them inside a single declaration: AppModel (139-694). The bar is 500 significant lines; this is 13 over it, 1.03\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/git.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e750535f1ac78533a7986067043fc142fb3a7b76801bf16bbbdda45042a917"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Dialog.render: MethodTooLong \u2014 render runs 102 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/dialog/view.rs"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fea62ee25f31ce7a9be74a35bb290fc0bcd162e68c9c20a5ae852b441efbde5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: browsers/mod.rs: FileTooLong \u2014 507 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 90% of them inside a single declaration: AppModel (78-702). The bar is 500 significant lines; this is 7 over it, 1.01\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/browsers/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db5204c5e712681faa7ca78ab873e997740add0c103701df7f93c0e039a2fdd8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model/agents_panel.rs: FileTooLong \u2014 506 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 80% of them inside a single declaration: AppModel (139-688). The bar is 500 significant lines; this is 6 over it, 1.01\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/agents_panel.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eaaea5034cca626de36b0745b3a893efebf9f1275ef8e01edca20e41524049a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: webview/mod.rs: FileTooLong \u2014 504 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 77% of them inside a single declaration: Webview (4 blocks, 96-621). The bar is 500 significant lines; this is 4 over it, 1.01\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/mod.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae824822841248e43b38ffc342f7fb8eb4ae74902cb060ce14c905c4bdd8d4e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (5 members, 17 shared lines): crates/muxy-app/src/views/settings/window.rs:248-288 | crates/muxy-app/src/views/settings/window.rs:296-336 | crates/muxy-app/src/views/settings/window.rs:345-395 | crates/muxy-app/src/views/settings/window.rs:404-453 | crates/muxy-app/src/views/settings/window.rs:492-535 \u2014 These 5 members are variants of one another: a block of 17 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/window.rs"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"1af59ed8e020c146c474d0d773f05d56c2b61cc405646353725202216b59e3f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): crates/muxy-app/src/views/terminal/colors.rs:98-115 | crates/muxy-app/src/views/terminal/colors.rs:117-135 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/colors.rs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2ad8400790787f5cbf3c5b82867d0892eaa3abafed7c68b0ea0d1db08dd24e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/muxy-app/src/ai.rs:491-504 | crates/muxy-app/src/extensions/io.rs:19-32 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/ai.rs"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0411181626e52e8d86ae373089d1548f2889940007faaf573347bc6585b9512"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/muxy-app/src/model/webviews.rs:702-715 | crates/muxy-app/src/model/webviews.rs:1292-1305 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/webviews.rs"},"region":{"startLine":702}}}],"partialFingerprints":{"codehealthFindingId/v1":"f713c16b8930c829e8cd81c5d80a9e950d4806a63940bbec48c4bca12b2a289e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): crates/muxy-app/src/views/agent_sessions.rs:95-108 | crates/muxy-app/src/views/webview/panel.rs:68-81 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/agent_sessions.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c211dac2856e391d78b7c477b59ee1c3cdf65436e722fcd6f4e62c3cc5621f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): crates/muxy-app/src/model.rs:2042-2054 | crates/muxy-app/src/model.rs:2076-2088 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":2042}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6c301b4cb995f3d9f7cd3cb7af047c8d1fcd6955c0846bdbad3e526062d1e2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): crates/muxy-server/src/git/command.rs:117-129 | crates/muxy-server/src/git/github.rs: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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/command.rs"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"408badc40782f926610ce466f2c377118238a9a35abdec35dbd841fa46f0a79d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/muxy-app/src/extensions/io.rs:26-37 | crates/muxy-app/src/model/extensions/local.rs:88-99 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/extensions/io.rs"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"017fd1c7460a356271fe5b2c1e871074d4236cb39aed2dfa20c9a189bf2bb0c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/muxy-app/src/model/extensions/calls.rs:351-362 | crates/muxy-app/src/model/extensions/calls.rs:474-485 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/calls.rs"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"66e1fdef0908f2992b31345d4379bc00acb5c074daf5bee299bb249c78336dc0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): crates/muxy-app/src/views/terminal/scroll.rs:263-274 | crates/muxy-cli/src/scroll.rs:142-153 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/scroll.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"8426fd8900351dfba22d631e66753122df405d88b49c3128726dcb7cb6ec0cae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): crates/muxy-server/src/git/github.rs:445-455 | crates/muxy-server/src/git/github.rs:468-479 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/github.rs"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5dec5ea00d61a690f40a3f81d2dd9d56fd6a0bcc1f6ec4f351962256249b30b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/muxy-app/src/model/extensions/items.rs:53-63 | crates/muxy-app/src/model/extensions/items.rs:88-98 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/items.rs"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c943d978dc28b93345237a8deeb7e3d05076ed08bd206a4fad99f3d6b1249e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/muxy-app/src/model/webviews.rs:232-242 | crates/muxy-app/src/model/webviews/panels.rs:509-519 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/webviews.rs"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a465eae70c730c563530c3cb2980a6a631ffb150ed50f5eaef6114bc0d62909"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/muxy-protocol/src/transport/tls.rs:108-118 | crates/muxy-protocol/src/transport/unix.rs:56-66 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/transport/tls.rs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0b5c56392a4c3b737ec747083297f34eb69e08694c3a4aaf2807ce0d2f3e656"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/muxy-protocol/src/transport/tls.rs:121-131 | crates/muxy-protocol/src/transport/unix.rs:69-79 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/transport/tls.rs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"330e5c837a62b5fd232300439d83b4857b9575c1b6f37c8b3a76a73cf547bf37"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): crates/muxy-ui/src/dialog.rs:86-96 | crates/muxy-ui/src/dialog.rs:204-214 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/dialog.rs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ff020442cb9323c5ee65fe23f2db2d270448d1bceba8ad6b2398bba11d7b560"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5): crates/muxy-app/src/views/settings/window.rs:279-288 | crates/muxy-app/src/views/settings/window.rs:327-336 | crates/muxy-app/src/views/settings/window.rs:386-395 | crates/muxy-app/src/views/settings/window.rs:444-453 | crates/muxy-app/src/views/settings/window.rs:526-535 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/window.rs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cae7f841312dad08fba27b2720a25b648d9514a81da9905b40226da8e896524"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/muxy-app-core/src/backup/mod.rs:66-75 | crates/muxy-server/src/settings.rs:24-33 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/mod.rs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc2ac2b433ebb49f76de095f0cd83f49822984042bb4d2c0f3a758c1fd9dca7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/muxy-app/src/model/git.rs:538-547 | crates/muxy-app/src/model/git.rs:669-678 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/git.rs"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e557b52ecda21b43ae388a9fd93de0db2f5de62713138fb112177587f15ec5e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/muxy-app/src/views/browser/mod.rs:801-810 | crates/muxy-app/src/views/webview/mod.rs:475-484 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":801}}}],"partialFingerprints":{"codehealthFindingId/v1":"51fe834fac474523bb176ec9ca3219e97628d4ce3e60155d40fcc3ed91df7f1a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 2): crates/muxy-server/src/catalog/storage.rs:15-24 | crates/muxy-server/src/remote/store.rs:128-135 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/catalog/storage.rs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e56f07a2b8ffd3db75e790d2e8abd8a528669d6c601bf887d9814dd822dc3ee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 4): crates/muxy-app/src/views/settings/window.rs:315-321 | crates/muxy-app/src/views/settings/window.rs:374-380 | crates/muxy-app/src/views/settings/window.rs:432-438 | crates/muxy-app/src/views/settings/window.rs:514-522 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/window.rs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"629ea8b0e622114e3eae060e26d72f222a8e3aff79c0a113330888da186723f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): crates/muxy-app/src/views/confirm.rs:71-79 | crates/muxy-app/src/views/confirm.rs:297-305 | crates/muxy-app/src/views/project_menu.rs:306-314 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/confirm.rs"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7e0edcdfee6a63f02bc5e853c6ef245a58534d041b89fbcc5880806fde3be23"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/muxy-app-core/src/backup/projects.rs:396-404 | crates/muxy-app-core/src/backup/projects.rs:612-620 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c1c6e4c5f11c6956bd3e6b268dbdce9e95a5f7d4f88e19e8db228b95f795a43"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/muxy-app/src/model/project_layouts.rs:120-128 | crates/muxy-app/src/views/session_picker.rs:42-50 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/project_layouts.rs"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac700d81564ad35c5690729904d145b95a346ec52a5c9344076b425a5c9094e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): crates/muxy-app/src/views/remote_servers.rs:1306-1314 | crates/muxy-app/src/views/remote_servers.rs:1351-1358 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/remote_servers.rs"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1ac272d38724a832d5226ea656b46fb87bd4cc04efe70e26073f24356005448"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 5): crates/muxy-app/src/views/settings/window.rs:267-273 | crates/muxy-app/src/views/settings/window.rs:313-320 | crates/muxy-app/src/views/settings/window.rs:373-379 | crates/muxy-app/src/views/settings/window.rs:431-437 | crates/muxy-app/src/views/settings/window.rs:513-519 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/window.rs"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"7169470aa984eb5f95f45d31ac0c5c6872ed0a7fa6c6dc3d46633082c2250243"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/muxy-app/src/proxy.rs:316-323 | crates/muxy-cli/src/clipboard.rs:65-72 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/proxy.rs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"829f75327466ab5f82c6cb612baac3f119ec653404e169370823af4b932e8c45"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/muxy-app/src/views/overlays.rs:172-179 | crates/muxy-app/src/views/overlays.rs:195-202 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/overlays.rs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"ead55c8bba4951d1a77456f49036cf0503a0a135d0b0e39477df4b22189a0a9d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/muxy-app/src/views/settings/extensions.rs:507-514 | crates/muxy-app/src/views/settings/extensions.rs:552-559 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/extensions.rs"},"region":{"startLine":507}}}],"partialFingerprints":{"codehealthFindingId/v1":"7530e6aff4303f6febbd71b2d49431f108bbad97bae97267e09bc9a921e8aaef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/muxy-cli/src/input.rs:106-113 | crates/muxy-mobile/src/keys.rs:107-114 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/input.rs"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"db312d11a3b520b3683d0949c9d1e41462d48ee794905676444b4189d1affd37"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/muxy-server/src/git/mod.rs:63-70 | crates/muxy-server/src/git/operations.rs:28-35 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/mod.rs"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1325d38da08c0d16ef72d34b1f5a9c0fafd964305b2d37910fd738a861f6df0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): crates/muxy-app/src/model/extensions/workspace.rs:37-43 | crates/muxy-app/src/proxy.rs:314-320 | crates/muxy-cli/src/clipboard.rs:63-69 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 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 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/workspace.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9984d8e8aa54913475b9ee8872cfb4e09698d1435c76aae0037020c4905c95d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): crates/muxy-app/src/views/overlays.rs:173-179 | crates/muxy-app/src/views/overlays.rs:196-202 | crates/muxy-app/src/views/overlays.rs:207-213 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/overlays.rs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"06ff2a01bd90050f8254cf4d89eb01c57df91a7c5f606b466321a158bcf1be74"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): crates/muxy-server/src/connection/reader.rs:209-215 | crates/muxy-server/src/connection/reader.rs:252-258 | crates/muxy-server/src/connection/reader.rs:274-280 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/reader.rs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"55343d7c9391d8481b4b1e1a322700a0378f7a1ba70755cb078439ef98af1d1b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/muxy-app-core/src/extensions/audit.rs:65-71 | crates/muxy-app/src/model/extensions/logs.rs:173-179 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/extensions/audit.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"e557b5ce9361182bdea72f71bbfd0487f0a769fa4310ff6d6371c2392a8089f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/muxy-client/src/requests.rs:31-37 | crates/muxy-client/src/requests.rs:91-97 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-client/src/requests.rs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"719fc4fb10bd932b099d710fd3a50e7e9aa22325a7b9f912309de085484500fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): crates/muxy-server/src/session/metadata/linux.rs:16-21 | crates/muxy-server/src/session/metadata/linux.rs:50-56 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/metadata/linux.rs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e28a7b9b874a9ee08bc61e7855d1a1445e505509c9e25402d9b4b36109ec38f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/muxy-ui/src/spinner.rs:123-129 | crates/muxy-ui/src/webview/host.rs:326-332 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/spinner.rs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"a52deb6103faefd809fceaab110116edb170c05b75c47bd6b94c20621d6551d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-app-core/src/settings/ghostty.rs:424-429 | crates/muxy-app-core/src/settings/ghostty/native.rs:150-155 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty.rs"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"6132664336efc2c327d65e8a6a0c24119af94391bea9da25ca07e616eb6b7a69"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-app/src/model/extensions/consent.rs:202-207 | crates/muxy-app/src/model/extensions/consent.rs:295-300 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/consent.rs"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"4283eeb9da8ace49c3970ac3ac07944875d643b6734aa15f74d2d5e3b8953e4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5\u20136 lines \u00D7 2): crates/muxy-app/src/updater/linux.rs:95-99 | crates/muxy-app/src/updater/macos.rs:136-141 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/updater/linux.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"49877db7e68323462fe0a59112bc0f1199d577799d44ecca9cc43a96f33aa4e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-ui/src/dialog.rs:114-119 | crates/muxy-ui/src/dialog.rs:369-374 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/dialog.rs"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f34371ea24cb82fec54c940a62449308e602549ebd8e3d69aed6a443d0f90f7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-app-core/src/opener.rs:127-131 | crates/muxy-server/src/session/metadata.rs:115-119 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/opener.rs"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d2fecb1d205057507bbedd949a97520106cae2458ceea9ffb681947a705dac8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-app/src/updater/macos.rs:185-189 | crates/muxy-app/src/updater/macos.rs:298-302 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/updater/macos.rs"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"630d4d6eedbfb73b32f156eedcfba30530d914a2806ef018c3c62b3c86e1594c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-app/src/views/settings/window.rs:356-360 | crates/muxy-app/src/views/settings/window.rs:412-416 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/window.rs"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff2805040dc2dfe694b93acc4452ba047ac3e08897d9468e569762c0b8edff1e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-ui/src/dialog.rs:66-70 | crates/muxy-ui/src/dialog.rs:188-192 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/dialog.rs"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b069b95b397fc6055ffdc63ee725019716912a65e7539cbdf8b93f5e40837c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-ui/src/voice/linux.rs:129-133 | crates/muxy-ui/src/voice/linux.rs:149-158 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/voice/linux.rs"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0eb635ddf72517c86f631777c10c4f2c6aefea7503e0b57823490293a433730"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): crates/muxy-app/src/ai.rs:375-382 | crates/muxy-server/src/git/command.rs:266-273 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/ai.rs"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"8226c8d87c6afe396a3781ba2f8424422d147884a04648c01796046c6c732f93"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-app/src/views/browser/mod.rs:775-780 | crates/muxy-app/src/views/webview/mod.rs:453-458 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cba67d32078e9bdf958e43030ea6db186a98e66f2149f869927e7e3b9054a8b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-app/src/views/browser/mod.rs:841-845 | crates/muxy-app/src/views/webview/mod.rs:295-299 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":841}}}],"partialFingerprints":{"codehealthFindingId/v1":"234dd9624e3c8167908a82224513cf51f20a18f5b313957649956e45ab4878ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-protocol/src/remote.rs:334-339 | crates/muxy-server/src/remote/store.rs:145-150 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/remote.rs"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c075118ee95c56d491caf7dc852172b657015c291de1ca7b5d7a8853c857aa0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-protocol/src/transport/tls.rs:57-62 | crates/muxy-server/src/remote/mod.rs:430-435 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/transport/tls.rs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a8efdf865e68616806a6fe389589464424d18633bb53d1c0b70b00f434185c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/muxy-server/src/files/watch.rs:145-151 | crates/muxy-server/src/git/watch.rs:151-157 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/files/watch.rs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"99ab8193b71cb0e5d9cbd20b5f47534496471de5f6bee43db98c650c44515522"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-ui/src/picker.rs:51-55 | crates/muxy-ui/src/text_input.rs:118-122 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8e8a259069df83714a4177ee26ce2a44682833de02a2a4affa979a1b8a1c399"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-client/src/catalog.rs:40-45 | crates/muxy-client/src/client.rs:175-180 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-client/src/catalog.rs"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"04172089f2825ea95e5fc2ae385e6d637e2bd64a8201b8b13f934645f4310d83"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-mobile/src/files.rs:50-55 | crates/muxy-mobile/src/git/repository.rs:40-45 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-mobile/src/files.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"81c91085d35063883247716015d78fceb330ab0c50da41bff030ecce0f2b6df8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/muxy-app/src/model/extensions/events.rs:59-68 | crates/muxy-app/src/views/tab_activity.rs:652-661 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/events.rs"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"03adbc33ef02a6c9a80e3a6ba0f898eb505c8e3a94526d4e46731e5040f27329"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): crates/muxy-app-core/src/composer/draft.rs:552-561 | crates/muxy-app-core/src/composer/draft.rs:569-578 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/composer/draft.rs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dbc98e08c5a03ba10c42714081ca075785250150184f297a0e8516e624f0ca3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): crates/muxy-app/src/views/font_picker.rs:92-100 | crates/muxy-app/src/views/settings/languages.rs:117-125 | crates/muxy-ui/src/command_palette.rs:364-372 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 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 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/font_picker.rs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7cb9c3843984bfe61222bcfb53ab405d6981fb3e1f40c752d39718ac471bbf0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): crates/muxy-app/src/views/proxy.rs:430-438 | crates/muxy-app/src/views/proxy.rs:445-453 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/proxy.rs"},"region":{"startLine":430}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a2227e272dcce34c56a4f0d8760482111adcad89180eb9348b901531244569c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): crates/muxy-app/src/model/extensions/events.rs:299-305 | crates/muxy-app/src/model/extensions/events.rs:310-316 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/events.rs"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"92ff8e391bd3f2427effeec60b601462ccd2d4e12c8611ce0fa859cf5ad8db8e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): crates/muxy-app/src/views/new_tab.rs:20-25 | crates/muxy-app/src/views/theme_picker.rs:17-22 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/new_tab.rs"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"760b9a764e082bc148fe2a7804576191c958d357e843e062b405aaf3a65e3d8d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-server/src/git/details.rs:115-119 | crates/muxy-server/src/git/read.rs:121-125 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/details.rs"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"7368f63a4d87ad574ea3293fcdb0af02de43b199e67a26eefb679d209f117f39"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): crates/muxy-server/src/connection/reader.rs:109-113 | crates/muxy-server/src/connection/reader.rs:120-124 | crates/muxy-server/src/connection/reader.rs:131-135 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/reader.rs"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"c68f41038ba2d896fe91fed0245d5e02c37d069e634895634bba9886600c295a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-server/src/files/watch.rs:110-114 | crates/muxy-server/src/git/watch.rs:117-121 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/files/watch.rs"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe18f347b032dc6b9e3bd0bf8c3e56168259ca7c943798eb7394ec3aeb58f83c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): crates/muxy-app/src/views/project_menu.rs:18-22 | crates/muxy-app/src/views/project_menu.rs:143-147 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/project_menu.rs"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"580bc77b0cda15f762af4f1aa012bd994cd6ce7eeecd84cb240be79384636ab2"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: muxy-protocol: muxy-protocol: abstractness 0.03, instability 0.00, distance 0.97 \u2014 zone of pain \u2014 concrete and depended on by 7 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"db37a21156a1baec2d088071143a7233014e21e15519d61e13e59c3c8d851ce4"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: muxy-core: muxy-core: abstractness 0.04, instability 0.00, distance 0.96 \u2014 zone of pain \u2014 concrete and depended on by 6 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d9f1d533ed73b825e94e3874be877a4dbac30ae228ef120611693fda87594389"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Settings (LCOM4 10): Settings\u0027s methods fall into 10 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 10 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/extensions/storage.rs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"dff751ab23ff6876dd35a60cee200155f85d43117700e6e9712e3e8fa3ab9f7c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TextInput (LCOM4 5): TextInput\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b8d3d11859fa46905190d761ee0aee31dd920c02d3c592387beed91f5eab713"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model.rs: crates/muxy-app/src/model.rs changed 83 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 50 in AppModel::receive at line 2157. 9 of those changes were fix/bug commits, and the other 74 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model.rs"},"region":{"startLine":2157}}}],"partialFingerprints":{"codehealthFindingId/v1":"62cca7dc141373df248f99aaddb36ce3c789e561b19dda72d10e9e80c5a14482"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/preferences.rs: crates/muxy-app/src/model/preferences.rs changed 44 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 60 in AppModel::apply_preference at line 315. 2 of those changes were fix/bug commits, and the other 42 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/preferences.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/preferences.rs"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d7a25cc898d4ccc52c035a0d337b8e034fdf50eb181aed14892645c9438d6a2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/menu.rs: crates/muxy-app/src/views/menu.rs changed 33 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 59 in AppModel::perform_menu at line 532. 3 of those changes were fix/bug commits, and the other 30 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/menu.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/menu.rs"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb279265ed726350f603ce140e4c39436cd7c4faa71918b8d4eb9965eafbebec"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/boot.rs: crates/muxy-app/src/boot.rs changed 29 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 49 in Work::name at line 387. 2 of those changes were fix/bug commits, and the other 27 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/boot.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/boot.rs"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"f85a7dfdf8ccbe7f2e2073a02dd29b9945ed345de0589a55486708c222ad610a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/overlays.rs: crates/muxy-app/src/views/overlays.rs changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in muxy_app::views::overlays::layer at line 164. 1 of those changes was a fix/bug commit, and the other 30 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/overlays.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/overlays.rs"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f66cc435481872cab844c0dad56ed1b6fd3e6d10b53d8bc45dc8359e1c1f707"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/git.rs: crates/muxy-app/src/model/git.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 75 in AppModel::receive_git at line 380. 1 of those changes was a fix/bug commit, and the other 10 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/git.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/git.rs"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7d0bad4bb35d06eac3dbf1a822e6f717c12ac846d6032545fb8d34203d7d493"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-server/src/connection/reader.rs: crates/muxy-server/src/connection/reader.rs changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 38 in muxy_server::connection::reader::ordered_request at line 289. 1 of those changes was a fix/bug commit, and the other 19 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-server/src/connection/reader.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/reader.rs"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"091270fd359493b6306ef64a4ca3c334c09488476b7bebc617474db5f229929c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/settings/appearance.rs: crates/muxy-app/src/views/settings/appearance.rs changed 17 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 44 in muxy_app::views::settings::appearance::rows at line 15. 1 of those changes was a fix/bug commit, and the other 16 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/settings/appearance.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/appearance.rs"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3dada789f54555d0e32eec08ac37cf2a5595c31863373c8b433099d9f094235"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/workspace.rs: crates/muxy-app/src/views/workspace.rs changed 44 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in AppModel::sync_pane_focus at line 861. 3 of those changes were fix/bug commits, and the other 41 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/workspace.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/workspace.rs"},"region":{"startLine":861}}}],"partialFingerprints":{"codehealthFindingId/v1":"2303010a5764c33d81462bc2631ab786545eea377313edf7465accba9184c313"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-server/src/session/owner.rs: crates/muxy-server/src/session/owner.rs changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in Owner::serve at line 276. 4 of those changes were fix/bug commits, and the other 19 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-server/src/session/owner.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/owner.rs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"a97b81f8faf5f92e5dbe65784af2e5643a42828ce15bcc24e4f34d795f8724fb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/terminal/pane.rs: crates/muxy-app/src/views/terminal/pane.rs changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in TerminalPane::key_binding at line 1487. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/terminal/pane.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/pane.rs"},"region":{"startLine":1487}}}],"partialFingerprints":{"codehealthFindingId/v1":"58dd60a1864521e0efab0f9e7408f46d149e3719906106492272fb82a6f87eae"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-protocol/src/validate.rs: crates/muxy-protocol/src/validate.rs changed 20 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in muxy_protocol::validate::validate_reply at line 259. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-protocol/src/validate.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/validate.rs"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7ddd2184dc2a55273c6ad6359289d39bf12ca53603212ebde8eb3f7474273f5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-ui/src/picker.rs: crates/muxy-ui/src/picker.rs changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in Picker::render_item at line 1182. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-ui/src/picker.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/picker.rs"},"region":{"startLine":1182}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bd28460cfe77ecbcc10abb831f4139e0bab7e4ab163ec67e0d2e413b9e15784"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app-core/src/state.rs: crates/muxy-app-core/src/state.rs changed 22 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in AppState::validate at line 1014. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app-core/src/state.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/state.rs"},"region":{"startLine":1014}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bbacc6d26119a15488b2a77a2602f89da19816b2083cb3610547913e8caa28b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/webviews.rs: crates/muxy-app/src/model/webviews.rs changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in AppModel::sync_webviews at line 93. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/webviews.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/webviews.rs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"467c7a06d4debb6a1f018d14dc8f5b231196c0a03e248bdd333ce0a2ad48ca06"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/git.rs: crates/muxy-app/src/views/git.rs changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in AppModel::update_git_picker at line 133. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/git.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git.rs"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5fb086d2bca7ef7df7189cf5ed56e67e7064943b56f44a479b56ebeedac3dbf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-server/src/connection/outbox.rs: crates/muxy-server/src/connection/outbox.rs changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in Outbox::push_control at line 245. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-server/src/connection/outbox.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/connection/outbox.rs"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"24fdeb81b4af358773a744bf291d5f68b0ac9c39b3178bde1786539089a8e6ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app-core/src/settings/keymap.rs: crates/muxy-app-core/src/settings/keymap.rs changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in Keymap::from_overrides at line 172. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app-core/src/settings/keymap.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/keymap.rs"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2eb899fd514891db37044ff57559577c1204623d110fdd056425c465996e491"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/project_picker.rs: crates/muxy-app/src/views/project_picker.rs changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in ProjectPicker::sync_picker at line 302. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/project_picker.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/project_picker.rs"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"e479d84ad8e4f648ee19384d7a1d4cf50855781a1183f80c465760f76bad5e39"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/catalog.rs: crates/muxy-app/src/model/catalog.rs changed 14 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in AppModel::receive_catalog at line 118. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/catalog.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/catalog.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"b65c484d4e182164667c419e3ce7b2c2b14e92d3cdbc6238df58c3022c3aece3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/extensions/calls.rs: crates/muxy-app/src/model/extensions/calls.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in AppModel::dispatch_extension at line 16. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/extensions/calls.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/calls.rs"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"1718cc601b804e60a8337cf531e904cf2c0fced70bd10dbe00edfc854c7d8886"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/terminal/element.rs: crates/muxy-app/src/views/terminal/element.rs changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in muxy_app::views::terminal::element::paint at line 870. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/terminal/element.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1fe62453c025d634712ee4106d29cf847b144d5fc4582a83715fa9c6bfc7b00"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/settings/window.rs: crates/muxy-app/src/views/settings/window.rs changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in SettingsWindow::open_picker at line 155. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/settings/window.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/window.rs"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"1897826896aad772a0ff7eae984435a8c7b83af41ec1599d7c1842215f622962"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/extensions/mod.rs: crates/muxy-app/src/model/extensions/mod.rs changed 15 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in AppModel::extension_client at line 192. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/extensions/mod.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/extensions/mod.rs"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4ed747a9c3f6f688b82026122064fdb178b492dcf3fdf129e054038d3563ea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/settings/terminal.rs: crates/muxy-app/src/views/settings/terminal.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in muxy_app::views::settings::terminal::rows at line 483. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/settings/terminal.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/terminal.rs"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"f854e9189979cca228cfbfa7b9b04822af64942c4358e364c5cfb934bdc59f83"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app-core/src/settings/ghostty.rs: crates/muxy-app-core/src/settings/ghostty.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in TerminalSettings::save at line 417. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app-core/src/settings/ghostty.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/settings/ghostty.rs"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"94fa7ca0b641fc2f57fe5ac1892a9f464a0aebcae2469c7833ef36a60fc82147"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/settings/results.rs: crates/muxy-app/src/views/settings/results.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in SettingsView::refresh_results at line 142. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/settings/results.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/results.rs"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"7456daf33f01ea485f96d472c54f825bd1b49d70b8e519b6472d68caf9d27f21"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-protocol/src/wire/codec.rs: crates/muxy-protocol/src/wire/codec.rs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in muxy_protocol::wire::codec::message at line 149. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-protocol/src/wire/codec.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/wire/codec.rs"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cc99816412ea3edb8037554495f33fd8dfbc45abfc286c5c367fc6b90c1da65"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-protocol/src/wire/kind.rs: crates/muxy-protocol/src/wire/kind.rs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in MessageKind::from_u8 at line 34. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-protocol/src/wire/kind.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/wire/kind.rs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1e912cb868eb66d9e953f0da979e5d1a6790c6a88001d18c5c049e8aa511328"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-ui/src/text_input.rs: crates/muxy-ui/src/text_input.rs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in TextElement::prepaint at line 1627. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-ui/src/text_input.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/text_input.rs"},"region":{"startLine":1627}}}],"partialFingerprints":{"codehealthFindingId/v1":"877397c061ad1046aa7e24f9b11fd3cc781687629382f1726f8de101b11b629c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/webview/mod.rs: crates/muxy-app/src/views/webview/mod.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in Webview::handle at line 200. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/webview/mod.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/mod.rs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"9150a36c62a1f54b2b2f5f0ed52f9a642f04b808d8e5d1ec966da23a12703f80"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-protocol/src/control.rs: crates/muxy-protocol/src/control.rs changed 16 times in last 90 days, max cyclomatic complexity 15 in ErrorCode::encode at line 307. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-protocol/src/control.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/control.rs"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"947e896fca227975794c038b3d58e372188ce49d8193e8b8e03579622d40865a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/boot/delivery.rs: crates/muxy-app/src/boot/delivery.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in Delivery::event at line 23. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/boot/delivery.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/boot/delivery.rs"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c65508d6ce3c23fa9fd1f8faa1093ea6a762a77c46009e0cba269d07ed9f8d4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-client/src/events.rs: crates/muxy-client/src/events.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in muxy_client::events::next_event at line 92. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-client/src/events.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-client/src/events.rs"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ddc6f9cc987f32f9946edd0c28b052debf326037411a02187440eb3bdf7cd7a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/links.rs: crates/muxy-app/src/model/links.rs changed 13 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in AppModel::terminal_menu at line 143. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/links.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/links.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcb6ce98152253d37df39fd50ba25e98c85dd45a2590b493320aa9956825e5e3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-server/src/git/mod.rs: crates/muxy-server/src/git/mod.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in Registry::dispatch_git at line 154. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-server/src/git/mod.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/mod.rs"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"72992ad040bc7d5f951194814f8607f7b0e90ed3e5472432271b7c4307937fc7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/composer.rs: crates/muxy-app/src/model/composer.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in AppModel::submit_composer at line 828. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/composer.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/composer.rs"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"65fea1b56934a32c0500c4baa4c8cab6adfea15433cd5d5e433fb79bb63e5535"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-cli/src/worker/io.rs: crates/muxy-cli/src/worker/io.rs changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in muxy_cli::worker::io::reader at line 194. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-cli/src/worker/io.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker/io.rs"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8ab506a5138f6a6e0fca08753f25ca71e25b6cd25267d00595ba75dbcd94a9d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-cli/src/args.rs: crates/muxy-cli/src/args.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in muxy_cli::args::command at line 75. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-cli/src/args.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/args.rs"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"77f5b6c87a9d2b7e1f052206ea3e0f10accbed0216c8253934ad69febbe41e6b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app-core/src/extensions/api.rs: crates/muxy-app-core/src/extensions/api.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in muxy_app_core::extensions::api::git_action at line 93. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app-core/src/extensions/api.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/extensions/api.rs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"a66ef9ce1e0239183aa8825b1b07c923de6d3b0275918d8950af358ad0dfb1de"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-protocol/src/git.rs: crates/muxy-protocol/src/git.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in GitRequest::validate at line 451. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-protocol/src/git.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-protocol/src/git.rs"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d72f445e5d71b2a561d3ac08d063e8fa6ed47e496cb03ebfb8b2dfd72c716c0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app-core/src/backup/projects.rs: crates/muxy-app-core/src/backup/projects.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in AppState::restore_configuration at line 98. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app-core/src/backup/projects.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/backup/projects.rs"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"16805163e1b89b0ee80de10ca3b8af337eb31e9d39405ffcd6d9674dbd7c0801"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/git/form.rs: crates/muxy-app/src/views/git/form.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in muxy_app::views::git::form::render at line 13. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/git/form.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/form.rs"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e999eb269130afd074ab3d266233c34f1afbb680fb29b3299764b14d2777720"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/git/pr.rs: crates/muxy-app/src/views/git/pr.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in AppModel::request_pull_request_action at line 118. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/git/pr.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/git/pr.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"19c9711792fd46f283271de77b2d4698bc365e3fe1520ff4da4e9bf1009a9e4c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-server/src/git/worktree.rs: crates/muxy-server/src/git/worktree.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in Registry::apply_worktree at line 338. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-server/src/git/worktree.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/worktree.rs"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"a34c31d11b6099d22fffe7e8186383fe6ddb12acf735c61c8633971e1de46376"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-server/src/session/metadata.rs: crates/muxy-server/src/session/metadata.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in Metadata::update at line 37. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-07-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-server/src/session/metadata.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/session/metadata.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ce5951eb90819cea1c0bc09a1e7b3eb1d5f56d27c7113d86b27061124997602"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app-core/src/catalog.rs: crates/muxy-app-core/src/catalog.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in AppState::merge_catalog at line 230. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app-core/src/catalog.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/catalog.rs"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"cca64053266641ca008dcee5aecc860b3846836cca970630bd5b3e975f5d7760"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-cli/src/worker.rs: crates/muxy-cli/src/worker.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in Core::connected at line 349. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-cli/src/worker.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/worker.rs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"96839e63fecd7f1eed74c7583f075c28756c7aacfeb4a655fd6dd044ebfe8dc5"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app-core/src/extensions/permissions.rs: crates/muxy-app-core/src/extensions/permissions.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in muxy_app_core::extensions::permissions::required_permission at line 43. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app-core/src/extensions/permissions.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app-core/src/extensions/permissions.rs"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"f287d41c18057ba07faee0c16a54008e37f99da7f1907eceec3be631139c23bf"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/repository_actions.rs: crates/muxy-app/src/repository_actions.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in muxy_app::repository_actions::prepare at line 217. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/repository_actions.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/repository_actions.rs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfdfcdf2b7a25e47d44eac40d70ded185aa415afb61b797c42e20279fb2ab13b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-cli/src/manage/args.rs: crates/muxy-cli/src/manage/args.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in muxy_cli::manage::args::session at line 330. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-cli/src/manage/args.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/manage/args.rs"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d7dd399bed8541853ca38fbad9732a21f1bd5b6aee4fa5cbb9a19e2351e4d1a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/worktrees.rs: crates/muxy-app/src/model/worktrees.rs changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in AppModel::worktrees_synced at line 499. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/worktrees.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/worktrees.rs"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ba15cc7fbd6ee0de0b3615ed699d947af3807a0e3d48d49ee401a2090b3642c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-server/src/git/github.rs: crates/muxy-server/src/git/github.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in Github::lookup_current at line 411. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-server/src/git/github.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/github.rs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f00c5a9fc059c116ad7e20f27db01c5e5329c0571b070783da1893ed77e3d6a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-server/src/git/command.rs: crates/muxy-server/src/git/command.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in muxy_server::git::command::capture_process at line 163. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-server/src/git/command.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-server/src/git/command.rs"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"9545a978079a6f53f7abafe067b9bae284b629fb6b45df1e0be586abbc3ecabb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/tab_strip/drag.rs: crates/muxy-app/src/views/tab_strip/drag.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in muxy_app::views::tab_strip::drag::move_pointer at line 279. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/tab_strip/drag.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/tab_strip/drag.rs"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"20ba101e1df85849ad57ae3fc137a8c839f41c4a68784829678feafbb7ce6f8f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-cli/src/manage/mod.rs: crates/muxy-cli/src/manage/mod.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in muxy_cli::manage::execute at line 76. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-cli/src/manage/mod.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-cli/src/manage/mod.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"12813ad169d18eb206917984e1e070b5d3f1e718c8ece16dc165a6e13908d566"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/backup/archive.rs: crates/muxy-app/src/backup/archive.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in muxy_app::backup::archive::read at line 144. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/backup/archive.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/backup/archive.rs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"8687f1ae979a9290e8a9912ee54d0def16882883596a13ee2f20c8ff75f31830"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/model/updates/status.rs: crates/muxy-app/src/model/updates/status.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in AppModel::update_details at line 50. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/model/updates/status.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/model/updates/status.rs"},"region":{"startLine":50}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e7f39d8b3402a8ad07a8cb6ace90d4bbe4d617238874aff821fc98d0f8ca23c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/settings/server.rs: crates/muxy-app/src/views/settings/server.rs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in muxy_app::views::settings::server::rows at line 7. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/settings/server.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/settings/server.rs"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf516e8facd6336e8a54d78453784c6de53622197ff476ef50369e9279a310e6"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/browser/mod.rs: crates/muxy-app/src/views/browser/mod.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in BrowserView::handle at line 233. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/browser/mod.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0e3ae653ec4f365f071439dcf6778bf0de7b0082f229f1775bd154265861b2f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: crates/muxy-app/src/views/menu/shortcuts.rs: crates/muxy-app/src/views/menu/shortcuts.rs changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in Command::shortcut at line 12. 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-30..2026-10-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-30 18:42:09 \u002B01:00\u0027 --until=\u00272026-10-28 18:42:09 \u002B01:00\u0027 --full-history --no-merges -- crates/muxy-app/src/views/menu/shortcuts.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/menu/shortcuts.rs"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"f251222abd0e405f85e63896987a0373631d7d45ce999e7de7799e1baebaeaa1"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 5 of 11 project(s) overshoot their size bounds, lowering Project Cohesion to 1.4/10. The most over is \u0060crates/muxy-app\u0060 (81557 LoC, 166 module-visible types across 31 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":"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":"c0436dae4adc4999975038ad6f6c76733c922fde09bd2fb01bc2448736cdca22"},"properties":{"commitSha":"88632974a2e7c950486f50037a5ba232ea3d1ef4"}},{"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":"8145ddcd49756762403f4546ff9ae566f5571e43db659fb39d8884529e7a52e1"},"properties":{"commitSha":"722a8d7faf67d8e2dcf96a8a967020df9feafd4b"}},{"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":"8eaeeaf2e7a7347138f931593e580a7e0e77e3f36313eed1f6c5cd8d546e3c47"},"properties":{"commitSha":"f437734efe902168885eef1ec84ce622ffa06927"}},{"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":"c61f9d82ce5065b68c7c13a9f6a42b72e77cba3af7377e9274abd94684b1feba"},"properties":{"commitSha":"f437734efe902168885eef1ec84ce622ffa06927"}},{"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":"ffb20b79a46216ace09a560f6de3a7fa9fb62169f73a121aa486b76abd79e63c"},"properties":{"commitSha":"722a8d7faf67d8e2dcf96a8a967020df9feafd4b"}},{"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":"8f03966f8e244eaf1db87927c33e9d93271bc57f92b252ae00b38e1748d01777"},"properties":{"commitSha":"f437734efe902168885eef1ec84ce622ffa06927"}},{"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":"45b48c06e1fe4b9bfd6b09a7ed452ebd5c947f0ebcd06badadd503bf6066e2e8"},"properties":{"commitSha":"f437734efe902168885eef1ec84ce622ffa06927"}},{"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":"f28276e1f8b31f271e4069dc664f0b4edc631a564ea150670af383764515ac22"},"properties":{"commitSha":"f437734efe902168885eef1ec84ce622ffa06927"}},{"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":"752d2f6c4d0da15a5c29affc24318559dc60dbc41251fec754f1a7962e848a89"},"properties":{"commitSha":"f437734efe902168885eef1ec84ce622ffa06927"}},{"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":"3b496ade5ffa2480eeab9501cd6fd9f961c748c3712ae248442d825fc13a2150"},"properties":{"commitSha":"f437734efe902168885eef1ec84ce622ffa06927"}},{"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":"a9e727021e9e429ad9158c409f1f25f055208cea1fa553019956581bf6e83233"},"taxa":[{"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":"281561d365e3533716f7be43f44d24c876953613462b7266bf5b980c7710062f"},"taxa":[{"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":"93726c58b06a973ef18a41fc4607b0fd47fd5a2b8c167776fb3e95a90161b2a8"},"taxa":[{"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":"53cc4b70c9b41c179e56e092989a7d5a253e48b9b87cb89a7de70db576284c1d"},"taxa":[{"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":"a40107e8df57476d835e9c6342e619d8919b4cc02a6a9fc8ed367256a3d10a76"},"taxa":[{"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":"bddc60459f02fe0c299ee08aae8a7106c5f827e35041e52fc73ec7aa893dff50"},"taxa":[{"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":"93748571d43f001d4296310dfe37e7fd48c0f5cd9f62ac08658acfd6e97554d5"},"taxa":[{"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":"7bbb5b0969007b3ad2bbb42b4ea86ac1b1adc2d39a9e7a92631e74c26d21c059"},"taxa":[{"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":"21b5803be678612a32cb5debe60eae1613cefed9b6de14e33de8aa00169bde32"},"taxa":[{"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":"ee787cbc370ce8c157b345b6a3a1200657a8b408359b4a0149addb85f63abd0d"},"taxa":[{"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":"498ab978c576868f25017feb3d10b5700d04ccaaa8341e016a162be303a6cda3"},"taxa":[{"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":"9e16225a12184b4c5906af952e8254213d391a01b1444d991051bc3bdd72946b"},"taxa":[{"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":"8fae306726af239025d2fe3781401505b4a1648463d26eb5a9ed4c8bf3309639"},"taxa":[{"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":"d08a08f4c9d3e32b86c17aab55aee6f586ddfaf00b71057630c171280a57f57e"},"taxa":[{"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":"139856cd34930cd794a1cb98c31dfaf90a03f932d06dc2e2cb492b731f6760fa"},"taxa":[{"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":"e5fe0db623ae0d827d9a2608b0cedc41c3d7579b41aa3bdce19bc8fde5a642e0"},"taxa":[{"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":"a1f31e3fc38e806c632551480508ae27b2701acddad0a9d80c648ba1fc9463b3"},"taxa":[{"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":"866f5db9e17cba13054be81498300d5689d6380b38ab693dd948f99e20adbff5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"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":"ab8bffab4a5a57290811cd2b63aac63d6f200ca8a63a8bbbe6e478796e5bae1a"},"taxa":[{"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":"54015389eb5f9a0beb6433e209224f32665bbffd45f48b4ac71eacdc7584cddd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"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":"c1bb7814097052b3b9e49cf20adb5ffa3c94da3abc00863955683dc4725b2e91"},"taxa":[{"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":"05dd1cc6a6536213feac72458953b3ecc92da85b7219289a9d2c68054660f8e9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"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":"506dd4e0944d6ad53119e3d3c2f82c93667a14edc2cc20430ba0b6169849d837"},"taxa":[{"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":"58416306c1a27a37c4768b939e55dd2865e8672774adab59964be2ffeffdd74f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"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":"ae4b19a624088a80ae967fa19fc6e2d3b4d86bf95f6afb9918729adad8224e32"},"taxa":[{"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":"a1873f73df2980e05749fb989e4983bd7e44b6790994284629fa7f4a2ef29ad4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"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":"33bcc43cc0454980e66469e464ca9d1ba2ec7bd694c573c00717afca33906bc8"},"taxa":[{"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":"99c8716916ca0dd9ddee8302208a5745bab6513f34ca12c2672d93f07c07be5f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"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":"e65f5f6b14cf9ede959b9d33fc660be74196cc664cdfa9f80c6888b828d6ef9a"},"taxa":[{"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":"065a8c6838aa2e95ca82dc26a8f9eb81051027432a4717ac3912a1141f9a84be"},"taxa":[{"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":"df186ad9e0ef59133af4334ec6053a9cf2228cd3deda2df6b6a10595f2a9fa6a"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01: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":"913b0259f2c2c9adc3268b8d2b4554cea52992cf47e7ff61c0df86670546b2e9"},"taxa":[{"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":"69c3d7a188cb66c89107c2fbd774454e481fba8ef440ff09a9cac8db714383eb"},"taxa":[{"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":"b21ef51d97f04d1a8b921e635aca9ef4e877341aa2c3b0f6eaeabc61234774b6"},"taxa":[{"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":"fd34071f0a37397b22950926e6e7d533f19a1ab2e35c80a3ec230eef7195ce4c"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01: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":"6504d8d1633fd2629c17cb911821ef9d4b240f323d5e1ebac2df01ac4726a04a"},"taxa":[{"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":"49c16b6fbc91670e61b639ab9c9270b4df42b6b11889eae216a02e4dd9c52b80"},"taxa":[{"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":"e7aea5ad354bb944fe749ff0e5f574830ccdd11e2edd1cb16678dd3d93b52205"},"taxa":[{"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":"fb4a23173542d7a1718b502d857067e50a3ab2bcd9e6cbc8252c0d9b2bd57371"},"taxa":[{"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":"a5a94de598d5f66dcc4ccfd4adeb9bbd82d59e61120ddfa86a1354ef816f7094"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A01: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":"8820ea123a859f3f325912f60a0545a931017499eaf7f9e45f6b94eb5326f811"},"taxa":[{"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":"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":"5700cf8ee182fc440abb16030061d2e9976929eb60c880096208a514bc453b10"},"properties":{"dependency":{"package":"zip","version":"8.6.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","RUSTSEC-2026-0367","RUSTSEC-2026-0368","RUSTSEC-2026-0369"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"45603727de1f1664dd47468fff3ee7436035c7e70bde082bf9895669c69809f8"},"properties":{"dependency":{"package":"grid","version":"0.18.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7ec937081c3ad6882e9c07735996d40cd6d5332ac535d70bb5252c6040e1f211"},"properties":{"dependency":{"package":"rustls-webpki","version":"0.103.15","advisory":"RUSTSEC-2026-0382","aliases":["[CVE redacted]","GO-2026-6809","RUSTSEC-2026-0381","RUSTSEC-2026-0383"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"95686d8e64236c3c2c566e482859faf67a5bbd9dbeebb6f4df8aab56c3496281"},"properties":{"dependency":{"package":"proc-macro-error","version":"1.0.4","advisory":"RUSTSEC-2024-0370","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f48cf8c9f415048128045caa118a1e03769d0b4fe18d7f036c2f3766e3e8d8fb"},"properties":{"dependency":{"package":"instant","version":"0.1.13","advisory":"RUSTSEC-2024-0384","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"5922a5beeab5ac077ffb485a783ad545036e79b56239f83da38f3fb84336b113"},"properties":{"dependency":{"package":"paste","version":"1.0.15","advisory":"RUSTSEC-2024-0436","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"97de2d9afba19ac7d5526d587e8aa29754fd1ff1c9caccbe9740917d4dd5ff14"},"properties":{"dependency":{"package":"async-std","version":"1.13.2","advisory":"RUSTSEC-2025-0052","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b5524f25221308ec94b7206b58afaa59996104c20abaa242285d451f5344e44b"},"properties":{"dependency":{"package":"rustls-pemfile","version":"2.2.0","advisory":"RUSTSEC-2025-0134","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d469c4cdd0b2892278c4ee90c01a5a8ea4872a98733c483777e04c904cfebdfc"},"properties":{"dependency":{"package":"proc-macro-error2","version":"2.0.1","advisory":"RUSTSEC-2026-0173","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"08ed4cdd902801a8c8ff36e4d4866dd7f9380036c6d99d81c8e9a39633a8e0f4"},"properties":{"dependency":{"package":"ttf-parser","version":"0.20.0","advisory":"RUSTSEC-2026-0192","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"50bebad955c4368aa7cfba16e2f3c5a024a0df720aa81ea155239e943487e598"},"properties":{"dependency":{"package":"ttf-parser","version":"0.21.1","advisory":"RUSTSEC-2026-0192","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cb53e7990382949a52a43a99fc0c53ff14bf1e010f61ce95ad624ba089ed3cc8"},"properties":{"dependency":{"package":"ttf-parser","version":"0.25.1","advisory":"RUSTSEC-2026-0192","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9415d46b8d59963c2017d834c30f38dfa1c7c1e4eaff635ba62828dc65292cee"},"properties":{"dependency":{"package":"rustybuzz","version":"0.14.1","advisory":"RUSTSEC-2026-0206","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cb303993327f676f2daee4362280fb56d1a9d776e1e99fb242130e8b577d7fe4"},"properties":{"dependency":{"package":"rustybuzz","version":"0.20.1","advisory":"RUSTSEC-2026-0206","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"77d4d5d4357ce0a5ade8f6f76c84914f1a2c80f9fe7358d9854254b760de650a"},"properties":{"dependency":{"package":"zvariant","version":"5.15.0","advisory":"RUSTSEC-2026-0370","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7f6329e2b29fe1ee1dd724766af980b151618490b720201bbdc1839704210c3e"},"properties":{"dependency":{"package":"zbus_names","version":"4.3.4","advisory":"RUSTSEC-2026-0371","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f67f0700e108bacf2f3dfd2008273e31f01b0ea1f2d5f9ef71c4f46ace73bbe9"},"properties":{"dependency":{"package":"zvariant_derive","version":"5.15.0","advisory":"RUSTSEC-2026-0372","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aee23c0997519f9a53e2269c98d35b0a266e7a24cad6a6d93c1c088edb4f3e32"},"properties":{"dependency":{"package":"basic-toml","version":"0.1.10","advisory":"RUSTSEC-2026-0374","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9985e934bf5258966ba30771d636042c3373acbe5f9699173950198ff207d4c4"},"properties":{"dependency":{"package":"git2","version":"0.20.4","advisory":"RUSTSEC-2026-0183","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1eae401a2a8770be38f5a54c3afe36fa4464ebe4004c5fb285ffaa2f1ae4d5b7"},"properties":{"dependency":{"package":"git2","version":"0.20.4","advisory":"RUSTSEC-2026-0184","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c64e30c28e3c0e2ac4c865fc1656b78d3404e0bf0484e55f9176b7c5f283f360"},"properties":{"dependency":{"package":"tokio","version":"1.53.1","advisory":"RUSTSEC-2026-0386","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d7481fb93c86b503a82a3e06a3172c7e27c5da26b8a178702a1e8028944c7596"},"properties":{"dependency":{"package":"rustls","version":"0.23.43","advisory":"[GHSA redacted]","aliases":["[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","RUSTSEC-2026-0285","RUSTSEC-2026-0346","RUSTSEC-2026-0348","RUSTSEC-2026-0349"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ca383df8f93c1fcb449201c7c47b9fc487e55acf31a9bb60212d29fe36dde189"},"properties":{"dependency":{"package":"block-buffer","version":"0.10.4","advisory":"[GHSA redacted]","reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"02807c2340c313bd085553cef2aa54725b58db377d04241d3195bea3a23b7783"},"properties":{"dependency":{"package":"glib","version":"0.18.5","advisory":"[GHSA redacted]","aliases":["RUSTSEC-2024-0429"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ffba3a9076a73cf66b6daacb5914c478fbdc74d1383d8d2e4003b6bf3aa7b43d"},"properties":{"dependency":{"package":"quinn-proto","version":"0.11.17","advisory":"RUSTSEC-2026-0338","aliases":["[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","RUSTSEC-2026-0340","RUSTSEC-2026-0343"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"},"taxa":[{"id":"CICD-SEC-9","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"},"taxa":[{"id":"CICD-SEC-8","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D36","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"cc682cd7167c2c692b624e54d299d32b2ea2b5b3eb72f5516f0dfab9c0ce991d"},"taxa":[{"id":"CICD-SEC-3","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":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"},"taxa":[{"id":"CICD-SEC-6","toolComponent":{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35"}}]},{"ruleId":"D44","level":"warning","message":{"text":"End-of-life runtime: Rust 1.92: rust-toolchain.toml declares Rust 1.92 as this project\u0027s toolchain file, and Rust 1.92, superseded by 1.93 on 2026-01-22 (the Rust project patches only the current stable). An unsupported runtime receives no security patches, so every vulnerability disclosed in it since 2026-01-22 is present and unfixable without moving off it. This is a migration rather than an upgrade: there is no newer release of a runtime that has ended."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"rust-toolchain.toml"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e1c535e20a660de116cadd75d9b6145780245baac38ee5f9ce346714a002ea5"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 1/5 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060crates/muxy-app\u0060, \u0060crates/muxy-cli\u0060, \u0060crates/muxy-mobile\u0060, \u0060crates/muxy-protocol\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"P6","level":"note","message":{"text":"No changelog: No CHANGELOG/HISTORY/RELEASES file \u2014 what shipped when isn\u0027t easy to reconstruct for support or audit. (Versioning/tagging makes releases traceable, but a changelog records the what.)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dda5aa5aed8cbb292c3ef2b733bc138f614293ae6426c85e98bf31ef330d9415"}},{"ruleId":"R1","level":"warning","message":{"text":"Type Safety: 0 typed \u00B7 5 plain JS \u2014 the untyped files are crates/muxy-app-core/src/browser/element_picker.js, crates/muxy-app/src/extensions/bridge.js, crates/muxy-app/src/extensions/script.js, crates/muxy-app/src/views/webview/bridge.js, crates/muxy-app/src/views/webview/bridge.test.cjs."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d00ee7953f55325a823d27e5db9657c80ca9b9861c0c0abf8fe487cd3fa586d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (43 matched lines \u00D7 2 locations): crates/muxy-app/src/extensions/bridge.js:216 \u00B7 crates/muxy-app/src/views/webview/bridge.js:80 \u2014 the two spans are one implementation copied and then locally edited \u2014 393 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":"crates/muxy-app/src/extensions/bridge.js"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"f524592fc5a5e849ecc3375f1c2bc68286306ca6bfadc28f635bee0bd820c240"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): crates/muxy-app/src/extensions/script.js:6 \u00B7 crates/muxy-app/src/views/webview/bridge.js:197 \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":"crates/muxy-app/src/extensions/script.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f37cc1fdd548412ffd34f6519ddfd9de925ab7d1c005a57a132842e4c0d38087"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function restore (cyclomatic 14, cognitive 19): restore has cyclomatic complexity 14 and cognitive complexity 19; 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":"crates/muxy-app-core/src/browser/element_picker.js"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"b45f560df3f6a9bf7bf2f4ad8809d3a943c2e42d038e61b6885d767bb2ae1733"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function open (cyclomatic 14, cognitive 17): open has cyclomatic complexity 14 and cognitive complexity 17; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"6578dd13506bddaf9378c38bcb74c158248e85e49644a01cb28dfc15f3f50d3c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 12, cognitive 16): (anonymous) has cyclomatic complexity 12 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":"crates/muxy-app/src/extensions/bridge.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c5da9b727f0c7a42ac2b50e238206713e14a09e7da6979eae56ea538379586c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function execPayload (cyclomatic 12, cognitive 13): execPayload has cyclomatic complexity 12 and cognitive complexity 13; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/extensions/bridge.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa8433f31d74fecd185fd77728fbd46a318c7eb4787a110986d38cafc10a63bb"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function __muxyTick (cyclomatic 11, cognitive 13): __muxyTick has cyclomatic complexity 11 and cognitive complexity 13; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/extensions/script.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ad79a563c515c05c646d04e95b641ddc2ddecfad18bb622d714a8f8a0c918bc"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!key.startsWith(\u0027extension.\u0027) || key.length \u003C= \u0027extension.\u0027.length\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/extensions/bridge.js, crates/muxy-app/src/views/webview/bridge.js. 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":"crates/muxy-app/src/extensions/bridge.js"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfd286b4b940cc01ee97265c5568cedb331904f9eb60cfb9e739b0fdf1ddc0cb"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060typeof o.onQuery === \u0027function\u0027 || typeof o.onQueryChange === \u0027function\u0027\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/extensions/bridge.js, crates/muxy-app/src/views/webview/bridge.js. 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":"crates/muxy-app/src/extensions/bridge.js"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb5b656c1c9442f7dba2cefa50f4675ac933ab7102a6b33c566a5127e9bf9b08"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060path.is_file() and not path.is_symlink()\u0060 appears character-identically in 4 files \u2014 scripts/install-desktop-linux.py, scripts/linux_packages.py, scripts/verify-desktop-formats.py, scripts/verify-desktop-linux.py. 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/install-desktop-linux.py"},"region":{"startLine":314}}}],"partialFingerprints":{"codehealthFindingId/v1":"249f6670d5e75b81e8b71d494117076401b719f0006d6e6889fdfd226906b957"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060server.poll() is None and socket.stat().st_ino == inode\u0060 appears character-identically in 2 files \u2014 scripts/verify-desktop-linux.py, scripts/verify-release-package.py. 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/verify-desktop-linux.py"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"f94b0823a503cb38f6bb6f1f4c2f335fb3a4c05a28e0be92c8ba3c8e549fbcd3"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060server.poll() is not None or time.monotonic() \u003E= deadline\u0060 appears character-identically in 2 files \u2014 scripts/smoke-headless.py, scripts/verify-desktop-linux.py. 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/smoke-headless.py"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e71464d84fbf56be7fd2d8ea2007083eafa18f7cd6501bc0656a4ebb7d2c8fe"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060!self.ready(server) || !self.confirmed(server)\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/model.rs, crates/muxy-app/src/model/remote_files.rs. 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":"crates/muxy-app/src/model.rs"},"region":{"startLine":1522}}}],"partialFingerprints":{"codehealthFindingId/v1":"b686350975662859ed1ed7541f3711e2292d4361e08365e48cabacdfa5e3fca4"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060error.code == ErrorCode::StaleHistoryCursor \u0026\u0026 request.before.0 != 0 \u0026\u0026 !self.restarted\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/views/terminal/scroll.rs, crates/muxy-cli/src/scroll.rs. 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":"crates/muxy-app/src/views/terminal/scroll.rs"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"247bc8f3b455d0eb95408c635fdf008acb121296bdb91e32610fd083c492450d"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060error.kind() == io::ErrorKind::WouldBlock \u0026\u0026 Instant::now() \u003C deadline\u0060 appears character-identically in 3 files \u2014 crates/muxy-client/src/local.rs, crates/muxy-core/src/bundle.rs, crates/muxy-server/src/archive.rs. 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":"crates/muxy-client/src/local.rs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad12362e91cabb7e9519d8aabb921bb376881f961801d0d72e5717e7ffcfd37e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060event.keystroke.key == \u0022tab\u0022 \u0026\u0026 !modifiers.control \u0026\u0026 !modifiers.alt \u0026\u0026 !modifiers.platform \u0026\u0026 !modifiers.function\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/views/proxy.rs, crates/muxy-app/src/views/remote_servers.rs. 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":"crates/muxy-app/src/views/proxy.rs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1d807e5ea0a4cf6220c26ad4ebacb8971140d04361b87e8e2ecd55bf95cecb5"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060model.overlay.is_some() || model.close_prompt.is_some()\u0060 appears character-identically in 3 files \u2014 crates/muxy-app/src/views/sidebar/resize.rs, crates/muxy-app/src/views/tab_strip/drag.rs, crates/muxy-app/src/views/titlebar.rs. 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":"crates/muxy-app/src/views/sidebar/resize.rs"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a770e842efc83942716f643aec1dc888f2b93821171836eba554dc37d2587a8"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060pane.native_visible \u0026\u0026 pane.grid.is_some()\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/views/quick_terminal.rs, crates/muxy-app/src/views/workspace.rs. 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":"crates/muxy-app/src/views/quick_terminal.rs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca90fd0f1d592342645106a482811c53a39b3b75248379a10a42fbabbc3bbd4a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060parent.home || parent.parent_id.is_some() || parent.kind.is_some()\u0060 appears character-identically in 2 files \u2014 crates/muxy-server/src/catalog/mod.rs, crates/muxy-server/src/git/worktree.rs. 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":"crates/muxy-server/src/catalog/mod.rs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab32573aa9f76c8edf20e33aa9e601e786ae3b4f60f5db7dc39651c04ebe32af"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060phase != DispatchPhase::Capture || event.button != MouseButton::Left\u0060 appears character-identically in 5 files \u2014 crates/muxy-app/src/views/agents_panel.rs, crates/muxy-app/src/views/sidebar/resize.rs, crates/muxy-app/src/views/splits/drag.rs, crates/muxy-app/src/views/tab_strip/drag.rs. 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":"crates/muxy-app/src/views/agents_panel.rs"},"region":{"startLine":952}}}],"partialFingerprints":{"codehealthFindingId/v1":"d038722d866e8b1643be99148682fca3d9ba4bde9ed91632bbe89d2f91d0c1b2"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060quad.size.width \u003E px(0.0) \u0026\u0026 quad.size.height \u003E px(0.0)\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/views/terminal/element/block.rs, crates/muxy-app/src/views/terminal/element/glyph.rs. 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":"crates/muxy-app/src/views/terminal/element/block.rs"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"34b78ce694e794ff55fa5402273437138b391bb117f527ab6a38971e0c3c03f9"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060rest.is_empty() || rest.starts_with(\u0027/\u0027)\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/model/extensions/consent.rs, crates/muxy-app/src/model/extensions/workspace.rs. 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":"crates/muxy-app/src/model/extensions/consent.rs"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfaedaa09698db7a3aed4b89ad525172f868ba40a7b1ca46e3e479d78b93fdd3"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060run.text.is_ascii() \u0026\u0026 run.text.len() == usize::from(run.width)\u0060 appears character-identically in 3 files \u2014 crates/muxy-app/src/views/terminal/element.rs, crates/muxy-app/src/views/terminal/selection.rs, crates/muxy-server/src/search.rs. 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":"crates/muxy-app/src/views/terminal/element.rs"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac93617a32c9a7e82b01571cbc94c176f5463aaa87066a08798090b14aaf7ba"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060self.is_quick_terminal(pane) \u0026\u0026 project.id == self.state.home().id\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/model.rs, crates/muxy-app/src/model/links.rs. 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":"crates/muxy-app/src/model.rs"},"region":{"startLine":1964}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ec28e7bf1a0866bec45bf2df00d37337c60aaf151b6d36a6a6119b42f48512d"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060self.name.trim().is_empty() || self.name.len() \u003E 256 || self.name.chars().any(char::is_control)\u0060 appears character-identically in 2 files \u2014 crates/muxy-app-core/src/settings/commands.rs, crates/muxy-app-core/src/settings/servers.rs. 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":"crates/muxy-app-core/src/settings/commands.rs"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdc295569efb5622bcb743123ebdca62de517b37f4ba335faae7f63b7b55b517"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060self.presentation.visible != visible || self.presentation.blocked != blocked\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/views/browser/mod.rs, crates/muxy-app/src/views/webview/mod.rs. 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":"crates/muxy-app/src/views/browser/mod.rs"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa15433c974c6213de47c1b68df6ad562d16623e0404742dde70e3edd5bd61c3"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060self.quitting != Quitting::Idle || self.close_prompt.is_some()\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/model/preferences.rs, crates/muxy-app/src/model/updates.rs. 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":"crates/muxy-app/src/model/preferences.rs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe678dd8b9c0a2b4d9b6c501a7c8cfb3b52003fd9a684fd153252f6117708cde"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060self.quitting != Quitting::Idle || self.close_request.is_some()\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/model.rs, crates/muxy-app/src/model/project_layouts.rs. 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":"crates/muxy-app/src/model.rs"},"region":{"startLine":681}}}],"partialFingerprints":{"codehealthFindingId/v1":"31c14ac0bac7b5dff0659168eb5abfae53a74c964c4cc24d6117b6c9c3d3b204"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060self.quitting == Quitting::Idle \u0026\u0026 self.close_prompt.is_none()\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/model/remote_servers.rs, crates/muxy-app/src/model/server_status.rs. 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":"crates/muxy-app/src/model/remote_servers.rs"},"region":{"startLine":972}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d40c83e0bb6bf21b2b9e2599aef70eb23c6f80f9e436ddc3fdab81b7b3caf6a"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060self.recording() \u0026\u0026 self.voice_snapshot.phase != muxy_ui::voice::Phase::Starting\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/views/composer/layout.rs, crates/muxy-app/src/views/composer/menu.rs. 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":"crates/muxy-app/src/views/composer/layout.rs"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d32567ec09f7935e1c863b8e4649235f00788c4fa290f2758304814237bd16e"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060server.incompatible \u0026\u0026 crate::model::released_version().is_some()\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/views/remote_servers.rs, crates/muxy-app/src/views/server_menu.rs. 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":"crates/muxy-app/src/views/remote_servers.rs"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c24308e5c81b68a075111b9a889a7fa6249dbe5312887b462f53808e6ff7b0b"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060server.missing \u0026\u0026 crate::model::released_version().is_some()\u0060 appears character-identically in 2 files \u2014 crates/muxy-app/src/views/remote_servers.rs, crates/muxy-app/src/views/server_menu.rs. 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":"crates/muxy-app/src/views/remote_servers.rs"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb8f28ffb5d1e5c51bcee1d85b24d8a80e4cc42406dfcc0a4d8f4e8de2cd8bf2"}},{"ruleId":"X14","level":"warning","message":{"text":"IP classification is bypassable through an IPv4-in-IPv6 embedding: This function unwraps IPv4-MAPPED IPv6 (\u0060to_ipv4_mapped\u0060, line 100) and then rejects \u006010.0.0.0/8\u0060 on its IPv4 path \u2014 but the IPv6 decision at line 93 classifies the address as written, and IPv4 reaches IPv6 through three MORE embeddings this function never mentions: IPv4-compatible (\u0060::a.b.c.d\u0060), 6to4 (\u00602002::/16\u0060) and NAT64 (\u006064:ff9b::/96\u0060). So \u0060::10.0.0.1\u0060, \u00602002:0a00:0001::\u0060 and \u006064:ff9b::10.0.0.0\u0060 all name a host inside \u006010.0.0.0/8\u0060 \u2014 the range this same function declares non-public \u2014 and all reach the IPv6 decision un-unwrapped, taking the opposite verdict. Unwrap every embedding to its IPv4 form before classifying, or reject any IPv6 address carrying an embedded IPv4 outright."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/extensions/http.rs"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"391f002a3cc7474062685766f05472ea14a5335127efc4ed42c00cfc7e54e9ac"}},{"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":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"d30f92e813af86aea58a14a1bab040667164e05ed23a9092e2ec84c770c15c62"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"610c4afcd6c6bfe18d974676f7a9d5e20fee1c60f3c6375b6f5e867d59cfde05"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d96739a1c7d5a3323d904299ec74ce9802b755107eca4edc03f41451cfeb1e1"}},{"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":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be00ec56f0fc78ca0827e7870a9a3b92f229704c776bdb1faa1248ab93f11df"}},{"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":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6e27d9f16f6d0aae7cd1f0fde883eceb14d7446d688d516f48b5be28f3fd993"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bcc0986f0024ca4b1a813c022cd8371f824a4eb455d2ff45a870b82012ef4af"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee2d495c5e5de8e85e4ffd1eed4d95e944c88b48389846075385c3a4cc2763be"}},{"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":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"6108bc21016e99683a86f76344e3ee611a5e0dc28758eb26d54cdbe6775d395c"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): \u0060.catch(() =\u003E {})\u0060 handles the rejection by doing nothing \u2014 the failure is discarded with no log and no rethrow, and the chain carries on as if the work succeeded. Log it through whatever this codebase already uses to report problems, hand it to a caller that can (\u0060next(error)\u0060, a returned rejection), or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/views/webview/bridge.js"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"93619723caa9e2663701309ce8584e5040f14d827e4939c7332da1e293262204"}},{"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":"crates/muxy-app/src/extensions/bridge.js"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"939c805f6c0d5879ff39f86358dd6ee83418195ea80051e3ee54f41416744894"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on Err: \u0060discover\u0060 turns every \u0060Err\u0060 into \u0060Vec::new()\u0060 \u2014 a failure becomes a plausible value and a silent behavior change with no trail. Log the error or propagate it with \u0060?\u0060. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the arm or in the doc comment, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-app/src/ai.rs"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0fcdb22a74a611bc6487b63c2f49dce2e306588a9a76794826fb943d2d64fa7"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on Err: \u0060number\u0060 turns every \u0060Err\u0060 into \u00600.0\u0060 \u2014 a failure becomes a plausible value and a silent behavior change with no trail. Log the error or propagate it with \u0060?\u0060. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the arm or in the doc comment, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-core/src/l10n/format.rs"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"96195015f94369da334c3fd5ad9f2066df71f4f5f7d38231ec9340ecfaad7287"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default on Err: \u0060web_context\u0060 turns every \u0060Err\u0060 into \u0060CString::default()\u0060 \u2014 a failure becomes a plausible value and a silent behavior change with no trail. Log the error or propagate it with \u0060?\u0060. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the arm or in the doc comment, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"crates/muxy-ui/src/webview/linux/page.rs"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"d86f64e31084696267bb2ed3bf3341ba71ed778224c1ca1d01dd8619bf41f0ee"}}],"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-1059","guid":"a2381a08-60f6-9554-a8b8-f3018cfaaca5","name":"Insufficient Technical Documentation","shortDescription":{"text":"Insufficient Technical Documentation"},"helpUri":"https://cwe.mitre.org/data/definitions/1059.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-250","guid":"52ee12e8-390a-7351-b1e6-388afa694e54","name":"CWE-250","shortDescription":{"text":"CWE-250"},"helpUri":"https://cwe.mitre.org/data/definitions/250.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"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-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-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":"A01:2025","guid":"df693558-c822-0452-8f7b-4d53cb6bcc59","name":"Broken Access Control","shortDescription":{"text":"Broken Access Control"},"helpUri":"https://top10.owasp.org/2025/A01_2025-Broken_Access_Control/"},{"id":"A02:2025","guid":"668dee9e-41bc-6354-97d0-fdf8f40c50c1","name":"Security Misconfiguration","shortDescription":{"text":"Security Misconfiguration"},"helpUri":"https://top10.owasp.org/2025/A02_2025-Security_Misconfiguration/"},{"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":"A07:2025","guid":"334ddd78-539d-d35c-83dd-253647eb7eaf","name":"Authentication Failures","shortDescription":{"text":"Authentication Failures"},"helpUri":"https://top10.owasp.org/2025/A07_2025-Authentication_Failures/"},{"id":"A08:2025","guid":"84b0c297-710e-9a5f-9335-936ecb260c36","name":"Software or Data Integrity Failures","shortDescription":{"text":"Software or Data Integrity Failures"},"helpUri":"https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/"}]},{"name":"OWASP Top 10 CI/CD Security Risks","guid":"3c9b2a6e-5d14-4f7b-8e02-6a1d9c4b7f35","organization":"OWASP Foundation","informationUri":"https://owasp.org/www-project-top-10-ci-cd-security-risks/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10 CI/CD Security Risks."},"taxa":[{"id":"CICD-SEC-3","guid":"458c83a6-ebf7-cf55-8cc3-b4d949bbf271","name":"Dependency Chain Abuse","shortDescription":{"text":"Dependency Chain Abuse"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-03-Dependency-Chain-Abuse"},{"id":"CICD-SEC-6","guid":"f2ee2486-b260-2952-a41f-6b67fa713940","name":"Insufficient Credential Hygiene","shortDescription":{"text":"Insufficient Credential Hygiene"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-06-Insufficient-Credential-Hygiene"},{"id":"CICD-SEC-8","guid":"b6b2dacf-a168-4957-876e-a8c73ee00eb0","name":"Ungoverned Usage of 3rd Party Services","shortDescription":{"text":"Ungoverned Usage of 3rd Party Services"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-08-Ungoverned-Usage-of-3rd-Party-Services"},{"id":"CICD-SEC-9","guid":"b3d36727-0395-5b51-94c4-5e173d62eab3","name":"Improper Artifact Integrity Validation","shortDescription":{"text":"Improper Artifact Integrity Validation"},"helpUri":"https://owasp.github.io/www-project-top-10-ci-cd-security-risks/CICD-SEC-09-Improper-Artifact-Integrity-Validation"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":82,"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."]}]}